回答:
PDFツールキットとして構築されたPure-Pythonライブラリ。それは可能です:
*ページごとにドキュメントを分割する、
* ページごとにドキュメントをマージする、
(そしてはるかに)
以下は、両方のバージョンで動作するサンプルプログラムです。
#!/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
# /programming/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, 'rb'))
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__':
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
pdf_cat(sys.argv[1:], sys.stdout)
open(input_file), 'r+b'
、そして私はsys.stdoutの代わりに使用しますoutput_stream = open('result.pdf', 'w+b')
。
+
、「読み取りと書き込み」を意味し、どちらのファイルも読み取りと書き込みの両方が行われません。stackoverflow.com/questions/2374427/…に基づくWindowsサポート出力サポートを追加しました。
sys.stdout.buffer
Python
ファイルの連結
メソッドを使用するだけでファイルを連結できます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")
merger.close()
必要に応じて、ファイルパスではなくファイルハンドルを渡すことができます。
ファイルのマージ
マージをより細かく制御したい場合は、のmerge
メソッドPdfMerger
を使用できます。これにより、出力ファイルに挿入ポイントを指定できます。つまり、ファイルの任意の場所にページを挿入できます。このappend
メソッドはmerge
、挿入ポイントがファイルの終わりであると考えることができます。
例えば
merger.merge(2, pdf)
ここでは、PDF全体を出力の2ページ目に挿入します。
ページ範囲
特定のファイルからどのページを追加するかを制御したい場合pages
はappend
、and のキーワード引数を使用して、(通常の関数のように)merge
タプルをフォームに渡すことができます。(start, stop[, step])
range
例えば
merger.append(pdf, pages=(0, 3)) # first 3 pages
merger.append(pdf, pages=(0, 6, 2)) # pages 1,3, 5
無効な範囲を指定すると、を取得しIndexError
ます。
注:また、ファイルが開かれたままになるのを避けるためPdfFileMerger
に、マージされたファイルが書き込まれたときにs closeメソッドを呼び出す必要があります。これにより、すべてのファイルがタイムリーに閉じられます(入力と出力)。PdfFileMerger
コンテキストマネージャーとして実装されていないのは残念なことです。そのため、with
キーワードを使用して、明示的なclose呼び出しを回避し、簡単な例外の安全性を確保できます。
pdfcat
pypdf2の一部として提供されているスクリプトを確認することもできます。完全にコードを記述する必要性を回避できる可能性があります。
PDFファイルをディレクトリに置きます。プログラムを起動します。すべてのPDFがマージされた1つの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)
pdfrw
ライブラリには、あなたがしおりや注釈を保存する必要はありませんし、あなたの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
著者です。
Pythonを使用して、別のPDFファイルをマージすることは可能ですか?
はい。
次の例では、1つのフォルダー内のすべてのファイルを1つの新しい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)
from PyPDF2 import PdfFileMerger
import webbrowser
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
def list_files(directory, extension):
return (f for f in os.listdir(directory) if f.endswith('.' + extension))
pdfs = list_files(dir_path, "pdf")
merger = PdfFileMerger()
for pdf in pdfs:
merger.append(open(pdf, 'rb'))
with open('result.pdf', 'wb') as fout:
merger.write(fout)
webbrowser.open_new('file://'+ dir_path + '/result.pdf')
Gitリポジトリ:https : //github.com/mahaguru24/Python_Merge_PDF.git
ここ、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"))
柔軟性を高めるためにディクショナリを使用したわずかなバリエーション(並べ替え、重複除去など):
import os
from PyPDF2 import PdfFileMerger
# use dict to sort by filepath or filename
file_dict = {}
for subdir, dirs, files in os.walk("<dir>"):
for file in files:
filepath = subdir + os.sep + file
# you can have multiple endswith
if filepath.endswith((".pdf", ".PDF")):
file_dict[file] = filepath
# use strict = False to ignore PdfReadError: Illegal character error
merger = PdfFileMerger(strict=False)
for k, v in file_dict.items():
print(k, v)
merger.append(v)
merger.write("combined_result.pdf")
私はLinuxプロセスでサブプロセスを利用してpdf uniteを使用し(one.pdfとtwo.pdfがディレクトリに存在すると想定)、それらをthree.pdfにマージすることを目的としています
import subprocess
subprocess.call(['pdfunite one.pdf two.pdf three.pdf'],shell=True)