python - 仅在某些 PDF 上使用 PyPDF2 发出水平翻转 PDF
问题描述
我需要编写一个程序,以便快速轻松地水平翻转 PDF 以用于构建基础蓝图,这些蓝图有时需要构建为建筑师设计方式的镜像,具体取决于房屋的运行方式。除了像 Adobe 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 小得多。
非常感谢任何见解!
解决方案
基于这个问题https://github.com/mfenniak/pyPdf/issues/13
并挖掘文件generic.py
我试过这个并且它有效:
PyPDF2.PdfFileReader(pdfFileObj, strict=True)
推荐阅读
- python - Django Channels:应用程序内部异常:消息类型app_consumer.notification_message没有处理程序
- python - 执行散列 python 代码(base64、sha256 或其他)
- postgresql - 使用带有 postgis 的 ST_Intersection 的错误结果
- ios - dyld:找不到符号 - iOS
- maven - 根据配置文件属性条件执行maven插件
- asp.net-web-api2 - 自定义 XML 格式化程序仅添加所需的命名空间
- amazon-web-services - 基于标签限制访问时无法访问其他角色
- mysql - MySQL多边形搜索过程
- android - 将 React Native 代码集成到现有的 android 项目中
- ios - 如何在 iOS 的应用内购买中获得活动产品的取消订阅?