우선 Reportlab은 훌륭합니다. pdfs를 생성하는 것으로 밝혀진 최고의 라이브러리.
예제를 시도하기 전에 reportlab를 설치하십시오 :
pip install reportlab
당신이 multibuild와 문서를 렌더링 및 바닥 글을 추가 할 canvasmaker를 사용할 필요가 각주를 만들려면.
먼저, 두 페이지에 간단한 PDF 파일을 만들 수 있습니다 : PDF 파일이 제대로 만들어 졌는지
from reportlab.platypus import (SimpleDocTemplate, Paragraph, PageBreak)
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import LETTER
if __name__ == '__main__':
# Content
styles = getSampleStyleSheet()
elements = []
elements.append(Paragraph("Hello", styles["Normal"]))
elements.append(Paragraph("World", styles["Normal"]))
elements.append(PageBreak())
elements.append(Paragraph("You are in page 2", styles["Normal"]))
# Build
doc = SimpleDocTemplate("my_file.pdf", pagesize=LETTER)
doc.build(elements)
확인합니다.이제
의 마지막 줄에 multibuild하는 라인과 페이지 번호를 표시하는 바닥 글을 그리고 빌드를 변경하는 캔버스 클래스를 추가 할 수 있습니다 :
이 multibuild에서
from reportlab.pdfgen import canvas
from reportlab.platypus import (SimpleDocTemplate, Paragraph, PageBreak)
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import LETTER
class FooterCanvas(canvas.Canvas):
def __init__(self, *args, **kwargs):
canvas.Canvas.__init__(self, *args, **kwargs)
self.pages = []
def showPage(self):
self.pages.append(dict(self.__dict__))
self._startPage()
def save(self):
page_count = len(self.pages)
for page in self.pages:
self.__dict__.update(page)
self.draw_canvas(page_count)
canvas.Canvas.showPage(self)
canvas.Canvas.save(self)
def draw_canvas(self, page_count):
page = "Page %s of %s" % (self._pageNumber, page_count)
x = 128
self.saveState()
self.setStrokeColorRGB(0, 0, 0)
self.setLineWidth(0.5)
self.line(66, 78, LETTER[0] - 66, 78)
self.setFont('Times-Roman', 10)
self.drawString(LETTER[0]-x, 65, page)
self.restoreState()
if __name__ == '__main__':
# Content
styles = getSampleStyleSheet()
elements = []
elements.append(Paragraph("Hello", styles["Normal"]))
elements.append(Paragraph("World", styles["Normal"]))
elements.append(PageBreak())
elements.append(Paragraph("You are in page 2", styles["Normal"]))
# Build
doc = SimpleDocTemplate("my_file.pdf", pagesize=LETTER)
doc.multiBuild(elements, canvasmaker=FooterCanvas)
당신은 또한 처음에 다른 캔버스를 지정할 수 있습니다 다음 페이지로 이동하십시오.
doc.multiBuild(Elements, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
희망 사항.
편집
목표는 이제 기존의 PDF 파일에 바닥 글을 추가하는 것입니다. 불행히도, 이것은 Reportlab (적어도 오픈 소스 버전에서만 가능합니다. proffesional 버전에는이 기능이 있습니다). "페이지를 추출, 원본 PDF를 열고, 그리고 :
Firt, 우리는 pdfrw 이제
pip install pdfrw
우리가이 일을 기존 PDF로 바닥 글을 추가 할 수 있습니다 약간 조리법에 추가 할 필요가 "그림 새로운 PDF로 바닥 글 따라 페이지, 한 번에 한 페이지 :
from reportlab.pdfgen.canvas import Canvas
from pdfrw import PdfReader
from pdfrw.toreportlab import makerl
from pdfrw.buildxobj import pagexobj
input_file = "my_file.pdf"
output_file = "my_file_with_footer.pdf"
# Get pages
reader = PdfReader(input_file)
pages = [pagexobj(p) for p in reader.pages]
# Compose new pdf
canvas = Canvas(output_file)
for page_num, page in enumerate(pages, start=1):
# Add page
canvas.setPageSize((page.BBox[2], page.BBox[3]))
canvas.doForm(makerl(canvas, page))
# Draw footer
footer_text = "Page %s of %s" % (page_num, len(pages))
x = 128
canvas.saveState()
canvas.setStrokeColorRGB(0, 0, 0)
canvas.setLineWidth(0.5)
canvas.line(66, 78, page.BBox[2] - 66, 78)
canvas.setFont('Times-Roman', 10)
canvas.drawString(page.BBox[2]-x, 65, footer_text)
canvas.restoreState()
canvas.showPage()
canvas.save()
부인 : 리눅스가 입력 파일로 Reportlab에 의해 생성 된 PDF 파일을 사용하여 테스트. 아마 임의의 pdf 파일에서 작동하지 않을 것입니다.
누군가 대답을하기 전까지는 os.system ("libreoffice --headless --invisible --convert-to doc' 또는 무엇인가 – Lynob