在 python 中合并旋转的 pdf 和非旋转的 pdf

merging rotated pdf with non rotated pdf in python

我正在使用 python 库 PyPDF2reportlab 将文本字段添加到现有 PDF 中。 我目前使用函数

def makeTextFields():

    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=landscape(letter))

    can.acroForm.textfield(name='fname', tooltip='First Name',
                    x=500, y=20, borderStyle='inset',
                    borderColor=blue, fillColor=blue, 
                    width=79, height=24,
                    textColor=black, forceBorder=False, annotationFlags ="")

    can.showPage()
    can.save()

    packet.seek(0)
    text_fields = PdfFileReader(packet)
    return text_fields

创建带有文本字段的 PDF,然后执行以下操作以加载基本 pdf、合并并保存

main = PdfFileReader(open("master.pdf", 'rb'))
text_fields = makeTextFields()

output = PdfFileWriter()
text_field_page = text_fields.getPage(0)
page = main.getPage(0)

page.mergePage(text_field_page)

output.addPage(text_field_page)

stream = open("dest.pdf", "wb")
output.write(stream)
stream.close()

这个解决方案可以正常工作,但是 master.pdf90 的旋转,这意味着当调用 page.mergePage 时,文本字段 pdf 会自动旋转 90 度以匹配基本 pdf并使文本字段与横向文本保持 90 度

我尝试了什么

我曾尝试用 page.mergeRotatedTranslatedPage 替换 page.mergePage 但没有成功,我还尝试设置 annotationFlags ="norotate" 根据 reportlab 文档应该允许文本字段忽略 canvas 旋转,但这没有用。最后我试过了

can.saveState()
can.rotate(90)
can.acroForm.textfield(name='fname', tooltip='First Name',
                    x=500, y=20, borderStyle='inset',
                    borderColor=blue, fillColor=blue, 
                    width=79, height=24,
                    textColor=black, forceBorder=False, annotationFlags ="")
can.restoreState()

希望将文本字段旋转到页面的 90 度偏移,以便当页面旋转到 90 度时它将为 0,但这似乎没有影响

我相信解决方案在于找到一种方法来取消文本字段上的旋转, 对文本字段应用初始旋转,或合并两个 pdf 而不匹配旋转。但是,任何其他解决方案/库都值得赞赏。

我也愿意在另一个程序中创建 pdf,然后使用 python 合并它们。或者如果 python 不是工作的最佳语言

,则使用不同的语言

试试这个

text_field_page.mergeRotatedTranslatedPage(页数,-90,页数。mediaBox.getWidth()/ 2,页数。mediaBox.getWidth()/ 2)