首页 > 解决方案 > 仅在某些 PDF 上使用 PyPDF2 发出水平翻转 PDF

问题描述

我需要编写一个程序,以便快速轻松地水平翻转 PDF 以用于构建基础蓝图,这些蓝图有时需要构建为建筑师设计方式的镜像,具体取决于房屋的运行方式。除了像 Adob​​e Acrobat(我的老板不愿意学习)这样的大型设计软件风格的 GUI 之外,我还没有找到可靠的软件来快速完成它。

我编写了一个简单的 python 程序,可以在某些 PDF 上运行,但在其他 PDF 上它会错误地翻转。似乎它能够正确翻转仅由图片组成的 PDF,但是当它翻转包含文本的 PDF 时,它会水平和垂直翻转,因此最终会镜像并上下翻转。

这是我第一次使用 PyPDF2,但我了解到 addTransformation 方法使用了一个转换矩阵,该矩阵放置在一个形状如下的元组中:

[scale x, skew x, skew y, scale y, translate x, translate y]

整体代码更大,所以如果您需要查看让用户选择文件的函数,请告诉我,但这里是翻转问题似乎所在的 PDF 的函数:

def horizontalPDF(filename):


    pdfFileObj = open(filename[0], 'rb')
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
    pdfWriter = PyPDF2.PdfFileWriter()


    for pageNum in range (pdfReader.numPages):
        page = pdfReader.getPage(pageNum)
        box = page.mediaBox
        page.addTransformation([-1,0,0,1,box[2],0])
        pdfWriter.addPage(page)

    f = filedialog.asksaveasfilename(title = "Save As",  defaultextension=".pdf", filetypes = (("pdf","*.pdf"),("all files","*.*")))

    pdfOutput = open(f, 'wb')
    pdfWriter.write(pdfOutput)
    pdfOutput.close()

主要问题必须与 addTransformation 方法有关,但我无法弄清楚为什么它会正确地转换一些 pdf 而另一些则不正确。框 [2] 是在整个 PDF 的宽度上翻译整个内容,因为在翻转后它会翻转到原点并且不再位于“画布”上。

有趣的是,在它不能正确翻转的 PDF 上,如果我使用垂直平移矩阵 [1,0,0,-1,0,box[3]],它实际上会按照我想要的方式工作(水平),但在它正确执行的 PDF 上,如果我使用垂直翻译功能,它会按预期垂直翻译。

更令人困惑的是,在某些 PDF 上,我收到一个错误:

PyPDF2.utils.PdfReadError: Multiple definitions in dictionary at byte 0x2a22cb for key /PageMode

但是,如果我将收到错误的 PDF 打印为 PDF,则新的 PDF 在我的程序中可以正常工作。

如果情况变得更糟,我可能会先将 PDF 转换为 JPG 并翻转它,我知道这更容易,然后再转换回 PDF,但如果我可以将 PDF 保持为真正的矢量文件,那将是理想的因为这些文件最终比大型 JPG 小得多。

非常感谢任何见解!

标签: pythonpython-3.xpdfpypdf2

解决方案


基于这个问题https://github.com/mfenniak/pyPdf/issues/13 并挖掘文件generic.py
我试过这个并且它有效:
PyPDF2.PdfFileReader(pdfFileObj, strict=True)


推荐阅读