Pythonを使用して、別個のPDFファイルをマージできますか?
そうだとすれば、これをもう少し拡張する必要があります。ディレクトリ内のフォルダをループして、この手順を繰り返したいと思っています。
そして、私は運を推し進めているかもしれませんが、PDFに含まれているページを除外することは可能です(私のレポート生成は常に余分な空白ページを作成します)。
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
# 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, '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 __== '__main__':
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
pdf_cat(sys.argv[1:], sys.stdout)
PyPdf2 s PdfMerger
クラスを使用できます。
ファイル連結
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
の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
キーワードを使用して、明示的な終了呼び出しを回避し、簡単な例外安全性を取得できます。
Pypdf2の一部として提供されている pdfcat
スクリプトもご覧ください。コードを完全に記述する必要性を潜在的に回避できます。
PyPdf2 githubも includes マージを示すコード例です。
Pythonを使用して、個別のPDF files?
はい。
次の例では、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 __== "__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)
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
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
著者です。
ここで、 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"))
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
柔軟性を高めるために辞書を使用するわずかなバリエーション(ソート、重複除去など):
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")