Python 通过PyPDF2合并两个PDF,但得到错误意外目标'/__WKANCHORèu2';

Python 通过PyPDF2合并两个PDF,但得到错误意外目标'/__WKANCHORèu2';,python,odoo,odoo-9,Python,Odoo,Odoo 9,通过python代码合并2 pdf时,我收到错误意外目标“/\uu wkancher\u 2”,我正在使用以下代码,请为我提供解决方案这是一个临时修复,当您在append方法中传入文件时,传入import\u bookmarks=False。这对我有用 from PyPDF2 import PdfFileMerger, PdfFileReader filepath_list = ['/tmp/abc.pdf','/tmp/xyz.pdf'] merger = PdfFileMerger() fo

通过python代码合并2 pdf时,我收到错误意外目标“/\uu wkancher\u 2”,我正在使用以下代码,请为我提供解决方案

这是一个临时修复,当您在append方法中传入文件时,传入
import\u bookmarks=False
。这对我有用

from PyPDF2 import PdfFileMerger, PdfFileReader
filepath_list = ['/tmp/abc.pdf','/tmp/xyz.pdf']
merger = PdfFileMerger()
for file_name in filepath_list:
 with open(file_name, 'rb') as f:
    merger.append(f)

merger.write("result.pdf")

如果@Tonechas提及的方法对您不起作用,请尝试@hannal提及的方法。我将其实现到一个单独的文件中,并按如下方式导入:

从uu_pypdf2_修复将NewPdfFileReader导入为PdfFileReader,将NewPdfFileMerger导入为PdfFileMerger
文件:

从PyPDF2导入PdfileReader、PdfileMerger
从PyPDF2.pdf导入ArrayObject,NameObject
从PyPDF2.utils导入isString
从PyPDF2.merge导入_MergedPage
从io导入字节io
从io导入文件io作为文件
StreamIO=BytesIO
类别newPdfileReader(PdfileReader):
定义初始化(self,*args,**kwargs):
super()
def_新建大纲(自身、节点):
目标、标题、大纲=无、无、无
如果节点中的“/A”和节点中的“/Title”:
#行动,第8.5节(仅支持GoTo类型)
title=节点[“/title”]
动作=节点[“/A”]
如果操作[“/S”]=“/GoTo”:
dest=操作[“/D”]
节点中的elif“/Dest”和节点中的“/Title”:
#目的地,第8.2.1节
title=节点[“/title”]
dest=节点[“/dest”]
#如果找到目标,则创建大纲
如果目的地:
如果存在(目标、阵列对象):
大纲=自我。构建目的地(标题、目的地)
elif isString(dest)和dest in self.\u namedTests:
大纲=自我。\u命名测试[dest]
大纲[名称对象(“/Title”)]=标题
elif isinstance(目标,名称对象):
通过
其他:
raise utils.PdfReadError(“意外目标%r”%dest)
返回大纲
NewPdfileReader.\u buildOutline=\u newBuildOutline
类newPdfilemerger(Pdfilemerger):
定义初始化(self,*args,**kwargs):
super()
def newMerge(self、position、fileobj、bookmark=None、pages=None、import\u bookmarks=True):
"""
将给定文件中的页面合并到
指定的页码。
:param int position:插入此文件的*页码*。文件将
在给定的数字之后插入。
:param fileobj:文件对象或支持标准读取的对象
和查找类似于文件对象的方法。也可以是
表示PDF文件路径的字符串。
:param str bookmark:您可以选择指定要应用于的书签
通过提供书签文本来显示包含文件的开头。
:param pages:可以是:ref:`Page Range`或``(开始、停止[,步骤]])``元组
仅合并源中指定范围的页面
将文档转换为输出文档。
:param bool import_bookmarks:您可以阻止源文档的书签
通过将其指定为“False”来导入。
"""
#此参数传递给self.inputs.append和means
#使用的流是在此方法中创建的。
my_file=False
#如果fileobj参数是字符串,则假定它是路径
#并在该位置创建一个文件对象。如果它是一个文件,
#将文件内容复制到BytesIO(或StreamIO)流对象中;如果
#它是一个PdfFileReader,将读者的流复制到
#BytesIO(或StreamIO)流。
#如果fileobj不是上述类型中的任何一种,则不会对其进行修改
解密密钥=无
如果是字符串(fileobj):
fileobj=file(fileobj,'rb')
my_file=True
elif isinstance(文件对象,文件):
fileobj.seek(0)
filecontent=fileobj.read()
fileobj=StreamIO(filecontent)
my_file=True
elif isinstance(文件对象、PdfFileReader):
orig_tell=fileobj.stream.tell()
fileobj.stream.seek(0)
filecontent=StreamIO(fileobj.stream.read())
fileobj.stream.seek(orig#u tell)#将流重置为其原始位置
fileobj=filecontent
如果hasattr(fileobj,“\u解密\u密钥”):
解密密钥=fileobj.\u解密密钥
my_file=True
#使用流创建新的PdfileReader实例
#(文件或BytesIO或StringIO)在上面创建
pdfr=NewPdfFileReader(fileobj,strict=self.strict)
如果解密密钥不是无:
pdfr._解密_密钥=解密_密钥
#查找要合并的页面范围。
如果页面==无:
pages=(0,pdfr.getNumPages())
elif isinstance(页面,页面范围):
pages=pages.index(pdfr.getNumPages())
elif not isinstance(页面、元组):
raise TypeError(““pages”必须是(开始,停止[,步骤])的元组)
srcpages=[]
如果是书签:
bookmark=bookmark(TextStringObject(bookmark)、NumberObject(self.id\u count)、NameObject('/Fit'))
大纲=[]
如果导入书签:
outline=pdfr.getOutlines()
大纲=自身。\修剪\大纲(pdfr,大纲,页数)
如果是书签:
self.bookmarks+=[书签,大纲]
其他:
self.bookmarks+=大纲
dests=pdfr.namedDestinations
目的地=自我调整目的地(pdfr、目的地、页数)
self.named_dests+=dests
#收集所有要合并的页面
对于范围内的i(*页):
pg=pdfr.getPage(一)
id=自身id\u计数
self.id\u计数+=1
mp=_合并页面(页面、pdfr、id)
srcpages.append(mp)
self.\u关联\u dests\u到\u页面(srcpages)
自己
from PyPDF2 import PdfFileMerger, PdfFileReader
filepath_list = ['/tmp/abc.pdf', '/tmp/xyz.pdf']
merger = PdfFileMerger()
for file_name in filepath_list:
 with open(file_name, 'rb') as f:
    merger.append(f, import_bookmarks=False )

merger.write("result.pdf")
from PyPDF2 import PdfFileMerger

pdf_files = ['pdf1.pdf', 'pdf2.pdf']

merger = PdfFileMerger()

for pdf_file in pdf_files:
    merger.append(pdf_file)

merger.write("merge_pdf.pdf")
merger.close()