如何用python填充pdf



我还没有一个具体的项目,但在预期中,我想知道是否有可能填充一个pdf与存储在mysql中的数据?

这将是一个有几个行和列历史的表单的问题,而不是简化的事情…如果是,使用什么技术/语言?

我找到了几个教程,但是从一个空白的pdf开始。我必须把数据放在特定的位置。

尝试使用PyFPDF或ReportLab在Python中创建和操作PDF文档。

使用PyMuPDF可以轻松地将文本放置在任何想要的位置,使用任何想要的字体。

例如,要在页面上从位置(x, y)开始放置一些文本,请执行以下操作:

import fitz  # import the package
doc = fitz.open("your.pdf")
page = doc[0]  # desired page, here: page 0
# insert starti 50 points from left, 36 points from top
page insert_text((50, 36), text)  # insert starts here

或者插入到矩形中,并在单词边界处自动换行

rect = fitz.Rect(50, 36, 150, 236)  # define rectangle
page.insert_textbox(rect, text)

矩形由其左上角(50,36)和右下角(150,236)坐标定义。在上面的例子中,一个100 x 200的矩形。

免责声明:我是borb的作者,这个库在这个答案中使用。

你实际上是在尝试基于一些数据构建一个定制的PDF。让我们以生成音乐会门票为例。

  1. 你有一个卖票的网站,
  2. 数据最终进入数据库,
  3. 每当有人想要打印他们的票时,你需要用他们的自定义数据(姓名,名字,座位号,QR码等)建立一个PDF

你可以做几件事来实现你的目标:

  1. 每次从头开始构建PDF
  2. 有一个模板PDF(所有的艺术品都完成了,有一些空槽可以填充数据)
  3. 有一个模板PDF(所有的插图都完成了,PDF包含可以填充数据的表单元素)

选项2和3,通常在工业中使用,因为设计门票(美术,布局等)的人并不是编写构建PDF所需代码的人。

使用borb,您可以将内容放置在确切的位置:

from borb.pdf import Document
from borb.pdf import Page
from borb.pdf import Paragraph
from borb.pdf import PDF
from borb.pdf.canvas.geometry.rectangle import Rectangle
from decimal import Decimal

def main():
# create Document
doc: Document = Document()
# create Page
page: Page = Page()
# add Page to Document
doc.add_page(page)
# define layout rectangle
# fmt: off
r: Rectangle = Rectangle(
Decimal(59),                # x: 0 + page_margin
Decimal(848 - 84 - 100),    # y: page_height - page_margin - height_of_textbox
Decimal(595 - 59 * 2),      # width: page_width - 2 * page_margin
Decimal(100),               # height
)
# fmt: on
# the next line of code uses absolute positioning
Paragraph("Hello World!").paint(page, r)
# store
with open("output.pdf", "wb") as pdf_file_handle:
PDF.dumps(pdf_file_handle, doc)

if __name__ == "__main__":
main()

你也可以填写表格:

from decimal import Decimal
from borb.pdf import HexColor
from borb.pdf import PageLayout
from borb.pdf import Document
from borb.pdf import Page
from borb.pdf import PDF

def main():
# open document
doc: typing.Optional[Document] = None
with open("output.pdf", "rb") as pdf_file_handle:
doc = PDF.loads(pdf_file_handle)
assert doc is not None
# set
doc.get_page(0).set_form_field_value("name", "Schellekens")
doc.get_page(0).set_form_field_value("firstname", "Joris")
doc.get_page(0).set_form_field_value("country", "Belgium")
# store
with open("output.pdf", "wb") as pdf_file_handle:
PDF.dumps(pdf_file_handle, doc)

if __name__ == "__main__":
main()

最新更新