我需要添加以下文本:"Hello World!"在PDF文件中使用Python,然后能够从PDF阅读器编辑它. 基本上,我需要一个打开PDF文件,然后添加可编辑的文本的Python脚本.然后,我还应该能够在Adobe Reader(或通用PDF阅读器)中编辑"Hello World!"中的句子."你好,吉姆!"

我试了很多库,比如pikepdf,reportlab,pypdf,PyPDF2,pdfrw等等,但我没有找到我需要的.

例如,使用以下代码,我可以在PDF文件中添加文本:

from reportlab.pdfgen import canvas

pdf = canvas.Canvas("s_pii_pdf_fac_simile_Copy.pdf")

pdf.drawString(x = 300, y = 400, text = "Hello World!", mode = None, charSpace = 2, direction = None, wordSpace = None)

但是,一旦我从Adobe Reader打开PDF文件,我就无法编辑文本.

另一个例子是:

from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from PyPDF2 import PdfFileReader, PdfFileWriter

text = "input.pdf"

pdf = canvas.Canvas(text)

pdf.drawCentredString(100, 0, "blablabla")
x = pdf.acroForm
x.textfield(fillColor = colors.yellow, borderColor = colors.black, textColor = colors.red, borderWidth = 2, borderStyle = 'solid', width = 500, height = 50, x = 50, y = 40, tooltip = None, name = None, fontSize = 20)

在这里,当我用Adobe Reader打开PDF文件时,我可以添加一个可编辑的框,但框是空的,我需要通过Adobe Reader手动添加文本.在本例中,我需要在框中预先填充"Hello world!"字符串,并能够从Adobe Reader编辑框中的文本:

enter image description here

你有什么办法让我解决这个问题吗?

推荐答案

disclaimer我是borb的作者,也就是这个答案中使用的图书馆.

让我们从创建一个带有FormField的基本PDF开始:

#!chapter_004/src/snippet_001.py
from decimal import Decimal

from borb.pdf import TextField
from borb.pdf import SingleColumnLayout
from borb.pdf import PageLayout
from borb.pdf import FixedColumnWidthTable
from borb.pdf import Paragraph
from borb.pdf import Document
from borb.pdf import Page
from borb.pdf import PDF


def main():

    # create Document
    doc: Document = Document()

    # create Page
    page: Page = Page()

    # add Page to Document
    doc.add_page(page)

    # set a PageLayout:
    # using a PageLayout means you don't need to worry about
    # the exact locations of content
    # kind of like how Microsoft Word works.
    layout: PageLayout = SingleColumnLayout(page)

    # add FixedColumnWidthTable containing Paragraph and TextField objects
    # FixedColumnWidthTable is an implementation of Table
    # that is designed to take up the full width of the Page
    # and divide that width evenly among its columns
    layout.add(
        FixedColumnWidthTable(number_of_columns=2, number_of_rows=3)
        .add(Paragraph("Name:"))
        .add(TextField(field_name="name"))
        .add(Paragraph("Firstname:"))
        .add(TextField(field_name="firstname"))
        .add(Paragraph("Country"))
        # add TextField already pre-filled with 'Belgium'
        .add(TextField(field_name="country", value="Belgium"))
        .set_padding_on_all_cells(Decimal(2), Decimal(2), Decimal(2), Decimal(2))
        .no_borders()
    )

    # store
    with open("output.pdf", "wb") as pdf_file_handle:
        PDF.dumps(pdf_file_handle, doc)


if __name__ == "__main__":
    main()

这将为我们提供以下PDF:

a PDF created by borb with a pre-filled TextField

borb可以使用pip或从GitHub上的源获得.

Python相关问答推荐

Snap 7- read_Area用于类似地址的变量

在Docker中运行HAProxy时无法获得503服务

模型序列化器中未调用现场验证器

查找下一个值=实际值加上使用极点的50%

Python中MongoDB的BSON时间戳

分组数据并删除重复数据

比较两个二元组列表,NP.isin

acme错误-Veritas错误:模块收件箱没有属性linear_util'

比较两个数据帧并并排附加结果(获取性能警告)

用Python解密Java加密文件

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

在含噪声的3D点网格中识别4连通点模式

Pandas Loc Select 到NaN和值列表

如何指定列数据类型

让函数调用方程

Polars asof在下一个可用日期加入

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

干燥化与列姆化的比较

关于两个表达式的区别