首先,Reportlab非常棒。这是我找到的最好的生成pdf的库。
在尝试示例之前,请安装reportlab:
pip install reportlab
要创建脚注,您需要使用multibuild渲染文档,并使用canvasmaker添加页脚。
首先,让我们创建一个包含两个页面的简单pdf文件:
from reportlab.platypus import (SimpleDocTemplate, Paragraph, PageBreak)
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import LETTER
if __name__ == '__main__':
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"]))
doc = SimpleDocTemplate("my_file.pdf", pagesize=LETTER)
doc.build(elements)
检查PDF文件是否正确创建。
现在,让我们添加一个canvas类来画页脚,显示一条线和页码,并将最后一行的build更改为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__':
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"]))
doc = SimpleDocTemplate("my_file.pdf", pagesize=LETTER)
doc.multiBuild(elements, canvasmaker=FooterCanvas)
在multibuild中,如果需要的话,您还可以为第一页指定一个不同的画布:
doc.multiBuild(Elements, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
希望这能帮到你。
编辑
现在的目标是向现有的PDF文件添加页脚。不幸的是,使用Reportlab无法单独完成此操作(至少我认为免费版本不能,专业版可能具备此功能)。
首先,我们需要在配方中添加一些pdfrw。
pip install pdfrw
现在我们可以通过以下方式向现有的PDF文件添加页脚:打开原始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"
reader = PdfReader(input_file)
pages = [pagexobj(p) for p in reader.pages]
canvas = Canvas(output_file)
for page_num, page in enumerate(pages, start=1):
canvas.setPageSize((page.BBox[2], page.BBox[3]))
canvas.doForm(makerl(canvas, page))
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()
免责声明:在Linux系统上测试,使用生成自Reportlab的PDF文件作为输入文件。它可能不适用于任意PDF文件。
os.system(“ libreoffice --headless --invisible --convert-to doc
或类似的东西。 - Lynob