繁体   English   中英

使用 Python 和 PyPDF2 合并 PDF 文件会引发 TypeError

[英]Merging PDF files using Python and PyPDF2 throws a TypeError

我正在使用Python 3.6.5将 PDF 合并在一起,但遇到了问题。 下面的代码抛出'TypeError: 'NumberObject' object is not subscriptable'错误。 我做错了什么? 当我用merger.appendmerger.append ,它会正确打印出文件路径。

import webbrowser
import os
from PyPDF2 import PdfFileMerger, PdfFileReader

path = 'C:/test/pdfs'
merger = PdfFileMerger()
for pdf in os.listdir(path):
      merger.append(PdfFileReader(open(os.path.join(path,pdf), 'rb')))
      print(os.path.join(path,pdf))
merger.write(path+'/merged.pdf')
merger.close()
webbrowser.open_new(path+'/merged.pdf')

文件“C:\\test\\pdftest.py”,第 9 行,在 merge.append(PdfFileReader(open(os.path.join(path,pdf), 'rb'))) 文件“C:\\python\\lib\\ site-packages\\pypdf2-1.26.0-py3.6.egg\\PyPDF2\\pdf.py", line 1084, in init self.read(stream) File "C:\\python\\lib\\site-packages\\pypdf2-1.26 .0-py3.6.egg\\PyPDF2\\pdf.py", line 1805, in read assert xrefstream["/Type"] == "/XRef" TypeError: 'NumberObject' object is not subscriptable

当我更改 merge.append 以采用文件路径时,我得到:

文件“C:\\test\\pdftest.py”,第 9 行,在 merge.append(os.path.join(path,pdf)) 文件“C:\\python\\lib\\site-packages\\pypdf2-1.26.0- py3.6.egg\\PyPDF2\\merger.py”,第 203 行,附加 self.merge(len(self.pages), fileobj, bookmark, pages, import_bookmarks) 文件“C:\\python\\lib\\site-packages\\ pypdf2-1.26.0-py3.6.egg\\PyPDF2\\merger.py”,第 133 行,合并 pdfr = PdfFileReader(fileobj, strict=self.strict) 文件“C:\\python\\lib\\site-packages\\pypdf2 -1.26.0-py3.6.egg\\PyPDF2\\pdf.py", line 1084, in init self.read(stream) File "C:\\python\\lib\\site-packages\\pypdf2-1.26.0-py3. 6.egg\\PyPDF2\\pdf.py", line 1805, in read assert xrefstream["/Type"] == "/XRef" TypeError: 'NumberObject' object is not subscriptable

更新:看起来文件夹中的其中一个 PDF 是导致此问题的原因。 与该 PDF 唯一不同的是它使用 Type 1 字体,而其他 PDF 使用 TrueType 字体。 有谁知道解决方法或解决这个问题?

这似乎是由无法识别或错误的 PDF 格式引起的。 我不是 PDF 专家,但 PyPDF2 似乎在抱怨外部参照表中的记录。 我发现解决这个问题的最简单方法是重新格式化 PDF。

我所做的是trymerger.append(PDFFileReader(file))放入try ,如果我发现'NumberObject' object is not subscriptable在异常中'NumberObject' object is not subscriptable消息,我将通过子'NumberObject' object is not subscriptable在无头模式下使用 LibreOffice“转换”PDF:

command = [r'"C:\Program Files\LibreOffice\program\soffice.bin"',
           '--convert-to', 'pdf', '--outdir', f'"{dest_file_path}"', f'"{file_name}"']
pdf_convert = subprocess.Popen(' '.join(command)) 

关于使用 LibreOffice 和子进程的说明:无论出于何种原因,我发现作为列表传递会导致我在 Windows 中出现访问被拒绝错误,这就是为什么我改为进行join

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM