为了账号安全,请及时绑定邮箱和手机立即绑定

使用 PyMuPDF 将文本添加到 pdf

使用 PyMuPDF 将文本添加到 pdf

幕布斯7119047 2023-04-25 17:28:56
我正在尝试通过打开 PDF、添加文本框并保存来将文本添加到 pdf。当我运行代码时,没有任何反应。在桌面上,它显示文件已更新,但上面没有显示文本。这是代码:import fitz doc = fitz.open("/Users/khaylablack/Desktop/participant_certificate.pdf")           page = doc[0]                         # choose some pagerect = fitz.Rect(50, 100, 200, 200)   # rectangle (left, top, right, bottom) in pixelstext = "absolutely not"rc = page.insertTextbox(rect, text, fontsize = 48, # choose fontsize (float)                   fontname = "Times-Roman",       # a PDF standard font                   fontfile = None,                # could be a file on your system                   align = 1)                      # 0 = left, 1 = center, 2 = right#doc.saveIncr()   # update file. Save to new instead by doc.save("new.pdf",...)doc.save("/Users/khaylablack/Desktop/watermarked_participant_cert.pdf")
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

当使用 insertTextbox() 方法时,您必须确保您创建的矩形可以包含文本,因为否则,您最终将不会显示任何文本。一种方法是为您的实现检查文本的长度,如下所示:


text = "absolutely not"

text_lenght = fitz.getTextlength(text, fontname="Times-Roman", fontsize=48))

text_lenght 将为 270.67。


但是您拥有的矩形宽度仅为 150(200-50)。此外,即使更改矩形的宽度也不起作用,因为它仍然太短,因此您还需要增加它的高度。您可以做的另一件事就是更改您正在使用的字体大小。这两个备选方案将如下所示:


备选方案 1,更大的矩形:

fontsize_to_use = 48


text = "absolutely not"

fontname_to_use = "Times-Roman"


text_lenght = fitz.getTextlength(text, 

                                 fontname=fontname_to_use, 

                                 fontsize=fontsize_to_use)


rect_x1 = 50

rect_y1 = 100

rect_x2 = rect_x1 + text_lenght + 2  # needs margin

rect_y2 = rect_y1 + fontsize_to_use + 2  # needs margin



rect = (rect_x1, rect_y1, rect_x2, rect_y2)


## Uncomment if you wish to display rect

# page.drawRect(rect,color=(.25,1,0.25)) 


rc = page.insertTextbox(rect, text,

                        fontsize=fontsize_to_use,

                        fontname=fontname_to_use,

                        align=1)

备选方案 2,较小的字体:


text = "absolutely not"

fontname_to_use = "Times-Roman"


rect_x1 = 50

rect_y1 = 100

rect_x2 = 200

rect_y2 = 200


rect_width = rect_x2 - rect_x1

rect_height = rect_y2 - rect_y1


rect = (rect_x1, rect_y1, rect_x2, rect_y2)


fontsize_to_use = rect_width/len(text)*2  # *2 just because 1pt is too small for a char. It mantains a good ratio for rect's width with larger text, but behaviour is not assured.


## Uncomment if you wish to display rect

# page.drawRect(rect,color=(.25,1,0.25))


rc = page.insertTextbox(rect, text,

                        fontsize=fontsize_to_use,

                        fontname=fontname_to_use,

                        align=1)

注意:rc是未使用的矩形高度,它也可以是负数,在你的例子中它是-5.59,这意味着文本超过了矩形的高度。


查看完整回答
反对 回复 2023-04-25
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

我遇到了同样的问题,我能够通过添加调用来解决它

page.clean_contents(False)

页面加载后。

来自 pyMuPDF官方文档:

Page.clean_contents(sanitize=True)

  • 在 v1.17.6 中更改

仅限 PDF:清除并连接contents与此页面关联的所有对象。“清理”包括内容流的语法更正、标准化和“漂亮打印”。如果 sanitize 为真,对象contents和对象之间的差异也将得到纠正。

在 1.16.0 版更改:此方法不再隐式清除注释。单独使用Annot.clean_contents()

参数: sanitize (bool) –(v1.17.6 中的新功能)如果为真,则资源与其在内容对象中的实际使用之间的同步是同步的。例如,如果一种字体实际上没有用于页面的任何文本,那么它将从 /Resources/Font 对象中删除。

警告:

这是一个复杂的功能,可能会生成大量新数据并使旧数据无法使用。不建议将它与增量保存选项一起使用。另请注意,生成的单例新/Contents对象是未压缩的。所以你应该使用选项“deflate=True, garbage=3”保存到一个新文件。


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 509 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信