有没有比逐页合并两个文件更快的方法?
Is there a faster way to merge two files rather than page by page?
我在 Python 3,使用 PyPDF2
and in order to add page numbers to a newly generated PDF (which I do using reportlab
) 我按以下方式逐页合并两个 PDF 文件:
from PyPDF2 import PdfFileWriter, PdfFileReader
def merge_pdf_files(first_pdf_fp, second_pdf_fp, target_fp):
"""
Merges two PDF files into a target final PDF file.
Args:
first_pdf_fp: the first PDF file path.
second_pdf_fp: the second PDF file path.
target_fp: the target PDF file path.
"""
pdf1 = PdfFileReader(first_pdf_fp)
pdf2 = PdfFileReader(second_pdf_fp)
assert (pdf1.getNumPages() == pdf2.getNumPages())
final_pdf_writer = PdfFileWriter()
for i in range(pdf1.getNumPages()):
number_page = pdf1.getPage(i)
content_page = pdf2.getPage(i)
content_page.mergePage(number_page)
final_pdf_writer.addPage(content_page)
with open(target_fp, "wb") as final_os:
final_pdf_writer.write(final_os)
但这很慢。使用 PyPDF2
?
是否有更快更简洁的方式来一次合并
试试这个。
您可以使用 PyPdf2s PdfMerger
class.
使用文件连接,您可以使用追加方法连接文件
from PyPDF2 import PdfFileMerger
pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf']
merger = PdfFileMerger()
for pdf in pdfs:
merger.append(pdf)
merger.write("result.pdf")
merger.close()
我没有足够的 'reputation' 发表评论。但是因为我要 post 一个答案,所以我把它写得很长。
通常,当人们想要 'merge' 文档时,他们的意思是 'combining' 他们,或者如您所指出的,将一个 pdf 连接或附加到另一个 pdf 的末尾(或介于两者之间的某个位置)。但是根据您提供的代码,您的意思似乎是将一个 pdf 叠加在另一个上,对吗?或者换句话说,您希望将 pdf1 和 pdf2 的第 1 页合并为一个页面,作为新 pdf 的一部分。
如果是这样,您可以使用它(根据用于说明水印的示例进行修改)。 还是一页一页叠加。但是,众所周知,pdfrw 与 PyPDF2 相比速度超快,并且应该与 reportlab 配合得很好。我还没有比较速度,所以不确定这是否真的会比你已经拥有的速度更快
from pdfrw import PdfReader, PdfWriter, PageMerge
p1 = pdfrw.PdfReader("file1")
p2 = pdfrw.PdfReader("file2")
for page in range(len(p1.pages)):
merger = PageMerge(p1.pages[page])
merger.add(p2.pages[page]).render()
writer = PdfWriter()
writer.write("output.pdf", p1)
也许答案会在 Is there a way to speed up PDF page merging... 中对您有所帮助,其中使用 multiprocessing 需要 100% 的处理器
我在 Python 3,使用 PyPDF2
and in order to add page numbers to a newly generated PDF (which I do using reportlab
) 我按以下方式逐页合并两个 PDF 文件:
from PyPDF2 import PdfFileWriter, PdfFileReader
def merge_pdf_files(first_pdf_fp, second_pdf_fp, target_fp):
"""
Merges two PDF files into a target final PDF file.
Args:
first_pdf_fp: the first PDF file path.
second_pdf_fp: the second PDF file path.
target_fp: the target PDF file path.
"""
pdf1 = PdfFileReader(first_pdf_fp)
pdf2 = PdfFileReader(second_pdf_fp)
assert (pdf1.getNumPages() == pdf2.getNumPages())
final_pdf_writer = PdfFileWriter()
for i in range(pdf1.getNumPages()):
number_page = pdf1.getPage(i)
content_page = pdf2.getPage(i)
content_page.mergePage(number_page)
final_pdf_writer.addPage(content_page)
with open(target_fp, "wb") as final_os:
final_pdf_writer.write(final_os)
但这很慢。使用 PyPDF2
?
试试这个。
您可以使用 PyPdf2s PdfMerger
class.
使用文件连接,您可以使用追加方法连接文件
from PyPDF2 import PdfFileMerger
pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf']
merger = PdfFileMerger()
for pdf in pdfs:
merger.append(pdf)
merger.write("result.pdf")
merger.close()
我没有足够的 'reputation' 发表评论。但是因为我要 post 一个答案,所以我把它写得很长。
通常,当人们想要 'merge' 文档时,他们的意思是 'combining' 他们,或者如您所指出的,将一个 pdf 连接或附加到另一个 pdf 的末尾(或介于两者之间的某个位置)。但是根据您提供的代码,您的意思似乎是将一个 pdf 叠加在另一个上,对吗?或者换句话说,您希望将 pdf1 和 pdf2 的第 1 页合并为一个页面,作为新 pdf 的一部分。
如果是这样,您可以使用它(根据用于说明水印的示例进行修改)。 还是一页一页叠加。但是,众所周知,pdfrw 与 PyPDF2 相比速度超快,并且应该与 reportlab 配合得很好。我还没有比较速度,所以不确定这是否真的会比你已经拥有的速度更快
from pdfrw import PdfReader, PdfWriter, PageMerge
p1 = pdfrw.PdfReader("file1")
p2 = pdfrw.PdfReader("file2")
for page in range(len(p1.pages)):
merger = PageMerge(p1.pages[page])
merger.add(p2.pages[page]).render()
writer = PdfWriter()
writer.write("output.pdf", p1)
也许答案会在 Is there a way to speed up PDF page merging... 中对您有所帮助,其中使用 multiprocessing 需要 100% 的处理器