在"PDF/A-1b“标准中,我想在每个页面上添加一个特定位置的文本/字符串到现有的PDF(多个页面)。
我已经阅读了这些文档,但是我无法解决它(到目前为止我可能还不太了解它),如何使用流和如何创建XObject。
有一个如何添加新字符串的小示例吗?
它可以是一个覆盖,也可以是另一个内容元素。
由于我刚刚创建了一个pikepdf字符串对象,没有XObject,所以这个方法无法工作,这将导致:
TypeError:其他对象不是我们可以转换成XObject的东西
import pikepdf
file_name ="example.pdf"
print(f"Current file: {file_name}")
pdf = pikepdf.Pdf.open(file_dict[each_pdf]["path"])
print("Number of pages:", len(pdf.pages))
some_text = pikepdf.objects.String('Some date like 20220629')
destination_page = pikepdf.Page(pdf.pages[0])
destination_page.add_overlay(some_text, pikepdf.Rectangle(0, 0, 300, 300))
pdf.save("example_with_text.pdf")
pdf.close()发布于 2022-06-29 14:31:15
好了,明白了。我读到过一种将同一对象“盖章”到所有页面的方法--再也找不到了。
这个解决方案符合我的问题:
from io import BytesIO
import pikepdf
from reportlab.pdfgen import canvas
def generate_stamp(msg, xy):
x, y = xy
buf = BytesIO()
c = canvas.Canvas(buf, bottomup=0)
c.setFontSize(16)
c.setFillColorCMYK(0, 0, 0, 0, alpha=0.7)
c.rect(194, 5, 117, 17, stroke=1, fill=1)
c.setFillColorCMYK(0, 0, 0, 100, alpha=0.7)
c.drawString(x, y, msg)
c.save()
buf.seek(0)
return buf
stamp = generate_stamp('SOME TEXT', (200, 20))
with pikepdf.open('[Path to in]/in.pdf') as pdf_orig, pikepdf.open(stamp) as pdf_text:
formx_text = pdf_orig.copy_foreign(pdf_text.pages[0].as_form_xobject())
for i in range(len(pdf_orig.pages)):
formx_page = pdf_orig.pages[i]
formx_name = formx_page.add_resource(formx_text, pikepdf.Name.XObject)
stamp_text = pdf_orig.make_stream(b'q 1 0 0 1 0 0 cm %s Do Q' % formx_name)
pdf_orig.pages[i].contents_add(stamp_text)
pdf_orig.save('[Path to out]/out.pdf')虽然不是我,但这只是一个来自jbarlow83本人的例子的小改编。
如果有改进的方法,请告诉我。
https://stackoverflow.com/questions/72797406
复制相似问题