使用PyMuPDF向pdf添加文本

2024-09-29 21:42:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过打开pdf,添加一个文本框,然后保存来向pdf添加文本。当我运行代码时,什么也没发生。在桌面上,它显示文件已更新,但没有显示任何文本

代码如下:

import fitz 
doc = fitz.open("/Users/khaylablack/Desktop/participant_certificate.pdf")           
page = doc[0]                         # choose some page
rect = fitz.Rect(50, 100, 200, 200)   # rectangle (left, top, right, bottom) in pixels

text = "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")

Tags: 代码textrect文本rightdocpdfpage
2条回答

您是否同时安装了pymupdf和fitz?如果没有,请尝试在命令提示符下运行这些命令

pip安装pymupdf
pip安装fitz

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

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

文本长度为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,这意味着文本超过了rect的高度

相关问题 更多 >

    热门问题