使用pypdf合并PDF文件
我正在写一个脚本,用来从一个网站(maya.tase.co.il)提取链接,下载PDF文件并把它们合并在一起。这个过程大部分时间都能正常工作,但在合并的时候,根据不同的文件会出现各种错误。我搞不清楚为什么会这样。我把相关的代码剪切出来,专门为两个特定的有问题的文件建立了一个测试。这个脚本使用了pypdf库,但我愿意尝试任何有效的方法。有些文件是加密的,有些则不是。
def is_incry(pdf):
from pyPdf import PdfFileWriter, PdfFileReader
input=PdfFileReader(pdf)
try:
input.getNumPages()
return input
except:
input.decrypt("")
return input
def merg_pdf(to_keep,to_lose):
import os
from pyPdf import PdfFileWriter, PdfFileReader
if os.path.exists(to_keep):
in1=file(to_keep, "rb")
in2=file(to_lose, "rb")
input1 = is_incry(in1)
input2 = is_incry(in2)
output = PdfFileWriter()
loop1=input1.getNumPages()
for i in range(0,loop1):
output.addPage(input1.getPage(i))#
loop2=input2.getNumPages()
for i in range(0,loop2):
output.addPage(input2.getPage(i))#
outputStream = file("document-output.pdf", "wb")
output.write(outputStream)
outputStream.close()
pdflen=loop1+loop2
in1.close()
in2.close()
os.remove(to_lose)
os.remove(to_keep)
os.rename("document-output.pdf",to_keep)
else:
os.rename(to_lose,to_keep)
in1=file(to_keep, "rb")
input1 = PdfFileReader(in1)
try:
pdflen=input1.getNumPages()
except:
input1.decrypt("")
pdflen=input1.getNumPages()
in1.close()
#input1.close()
return pdflen
def test():
import urllib
urllib.urlretrieve ('http://mayafiles.tase.co.il/RPdf/487001-488000/P487028-01.pdf', 'temp1.pdf')
urllib.urlretrieve ('http://mayafiles.tase.co.il/RPdf/488001-489000/P488170-00.pdf', 'temp2.pdf')
merg_pdf('temp1.pdf','temp2.pdf')
test()
感谢任何花时间阅读这个内容的人。
Al.
2 个回答
0
我试着用pyPdf处理这些文档,发现这两个PDF文件都是加密的,空密码("")是无效的。
查看Adobe的安全设置,你可以打印和复制文件,但当你用pyPdf的input.decrypt("")来解密时,文件还是加密的(也就是说,运行input.getNumPages()后仍然返回0)。
我能在OSX的预览中打开这个文件,并且可以把PDF保存为未加密的版本,这样后面的操作就正常了。不过,pyPdf是处理页面的,所以我觉得你不能通过pyPdf来做到这一点。你要么找到正确的密码,要么可以试试其他应用,比如用批处理的方式在OpenOffice中处理,或者用其他PDF插件也可以。
1
我之前写过一个复杂的PDF生成和合并的程序,现在我把它开源了。
你可以去看看:https://github.com/becomingGuru/nikecup/blob/master/reg/models.py#L71
def merge_pdf(self):
from pyPdf import PdfFileReader,PdfFileWriter
pdf_file = file_names['main_pdf']%settings.MEDIA_ROOT
pdf_obj = PdfFileReader(open(pdf_file))
values_page = PdfFileReader(open(self.make_pdf())).getPage(0)
mergepage = pdf_obj.pages[0]
mergepage.mergePage(values_page)
signed_pdf = PdfFileWriter()
for page in pdf_obj.pages:
signed_pdf.addPage(page)
signed_pdf_name = file_names['dl_done']%(settings.MEDIA_ROOT,self.phash)
signed_pdf_file = open(signed_pdf_name,mode='wb')
signed_pdf.write(signed_pdf_file)
signed_pdf_file.close()
return signed_pdf_name
它运行得非常顺利。希望对你有帮助。