我做了一個搜索,似乎沒有什麼與這個問題直接相關。是否有可能使用Python來合併單獨的PDF文件?合併PDF文件
假設是這樣,我需要進一步擴展這一點。我希望循環瀏覽目錄中的文件夾並重復此過程。
我可能會推動我的運氣,但可以排除PDF中包含的頁面(我的報告生成總是會創建一個額外的空白頁面)。
我做了一個搜索,似乎沒有什麼與這個問題直接相關。是否有可能使用Python來合併單獨的PDF文件?合併PDF文件
假設是這樣,我需要進一步擴展這一點。我希望循環瀏覽目錄中的文件夾並重復此過程。
我可能會推動我的運氣,但可以排除PDF中包含的頁面(我的報告生成總是會創建一個額外的空白頁面)。
一個純Python庫內置的PDF工具包。它能夠:
*拆分文件一頁一頁,
*通過頁面合併文檔頁面,
(以及更多)
下面是一個示例程序,與這兩個版本的作品。
#!/usr/bin/env python
import sys
try:
from PyPDF2 import PdfFileReader, PdfFileWriter
except ImportError:
from pyPdf import PdfFileReader, PdfFileWriter
def pdf_cat(input_files, output_stream):
input_streams = []
try:
# First open all the files, then produce the output file, and
# finally close the input files. This is necessary because
# the data isn't read from the input files until the write
# operation. Thanks to
# https://stackoverflow.com/questions/6773631/problem-with-closing-python-pypdf-writing-getting-a-valueerror-i-o-operation/6773733#6773733
for input_file in input_files:
input_streams.append(open(input_file))
writer = PdfFileWriter()
for reader in map(PdfFileReader, input_streams):
for n in range(reader.getNumPages()):
writer.addPage(reader.getPage(n))
writer.write(output_stream)
finally:
for f in input_streams:
f.close()
if __name__ == '__main__':
pdf_cat(sys.argv[1:], sys.stdout)
使用Python合併單獨的PDF文件可能嗎?
是的。
下面的例子合併在一個文件夾中的所有文件到一個新的PDF文件:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from argparse import ArgumentParser
from glob import glob
from pyPdf import PdfFileReader, PdfFileWriter
import os
def merge(path, output_filename):
output = PdfFileWriter()
for pdffile in glob(path + os.sep + '*.pdf'):
if pdffile == output_filename:
continue
print("Parse '%s'" % pdffile)
document = PdfFileReader(open(pdffile, 'rb'))
for i in range(document.getNumPages()):
output.addPage(document.getPage(i))
print("Start writing '%s'" % output_filename)
with open(output_filename, "wb") as f:
output.write(f)
if __name__ == "__main__":
parser = ArgumentParser()
# Add more options if you like
parser.add_argument("-o", "--output",
dest="output_filename",
default="merged.pdf",
help="write merged PDF to FILE",
metavar="FILE")
parser.add_argument("-p", "--path",
dest="path",
default=".",
help="path of source PDF files")
args = parser.parse_args()
merge(args.path, args.output_filename)
這裏,http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/,給出了一個解決方案。
類似:
from pyPdf import PdfFileWriter, PdfFileReader
def append_pdf(input,output):
[output.addPage(input.getPage(page_num)) for page_num in range(input.numPages)]
output = PdfFileWriter()
append_pdf(PdfFileReader(file("C:\\sample.pdf","rb")),output)
append_pdf(PdfFileReader(file("c:\\sample1.pdf","rb")),output)
append_pdf(PdfFileReader(file("c:\\sample2.pdf","rb")),output)
append_pdf(PdfFileReader(file("c:\\sample3.pdf","rb")),output)
output.write(file("c:\\combined.pdf","wb"))
較新PyPdf2庫有一個PdfMerger
類,它可以像這樣被使用。
例如:
from PyPDF2 import PdfFileMerger
pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf']
merger = PdfFileMerger()
for pdf in pdfs:
merger.append(open(pdf, 'rb'))
with open('result.pdf', 'wb') as fout:
merger.write(fout)
的append
方法似乎需要一個懶惰文件對象。那就是它不會立即讀取文件。它似乎要等到write
方法被調用。如果使用範圍開放(即with
),則會將空白頁附加到結果文件中,因爲輸入文件在該點處關閉。
如果文件句柄生存期是一個問題,避免這種情況的最簡單方法是傳遞append
文件名字符串並允許它處理文件生存期。
即
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")
的pdfrw
library可以做到這一點很容易,假設你並不需要保存書籤和註釋,以及您的PDF不加密。 cat.py
是一個示例級聯腳本,subset.py
是一個示例頁面子集化腳本。
串聯腳本的相關部分 - 假設inputs
輸入文件名列表,並outfn
是一個輸出文件名:
from pdfrw import PdfReader, PdfWriter
writer = PdfWriter()
for inpfn in inputs:
writer.addpages(PdfReader(inpfn).pages)
writer.write(outfn)
正如你由此可以看出,這將是很容易省略最後一頁,例如例如:
writer.addpages(PdfReader(inpfn).pages[:-1])
聲明:我是主要pdfrw
作者。
將pdf文件放在目錄中。啓動程序。您將得到一份pdf,併合並所有pdf。
import os
from PyPDF2 import PdfFileMerger
x = [a for a in os.listdir() if a.endswith(".pdf")]
merger = PdfFileMerger()
for pdf in x:
merger.append(open(pdf, 'rb'))
with open("result.pdf", "wb") as fout:
merger.write(fout)
而現在,https://pypi.python.org/pypi/PyPDF2的後繼項目PyPDF – 2013-08-22 10:04:37
@伊阿古,利托下面看[這裏](https://stackoverflow.com/a/37945454/1540468)回答。 – 2017-12-13 09:10:41