web-dev-qa-db-ja.com

マージPDFファイル

Pythonを使用して、別個のPDFファイルをマージできますか?

そうだとすれば、これをもう少し拡張する必要があります。ディレクトリ内のフォルダをループして、この手順を繰り返したいと思っています。

そして、私は運を推し進めているかもしれませんが、PDFに含まれているページを除外することは可能です(私のレポート生成は常に余分な空白ページを作成します)。

87
Btibert3

Pypdf またはその後継 PyPDF2 を使用します。

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)
96
Gilles

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およびappendmergeキーワード引数を使用して、タプルを(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が返されます。

注:また、ファイルが開いたままにならないようにするには、マージされたファイルが書き込まれたときにPdfFileMergers closeメソッドを呼び出す必要があります。これにより、すべてのファイルがタイムリーに閉じられます(入力および出力)。 PdfFileMergerがコンテキストマネージャとして実装されていないのは残念です。したがって、withキーワードを使用して、明示的な終了呼び出しを回避し、簡単な例外安全性を取得できます。

Pypdf2の一部として提供されている pdfcat スクリプトもご覧ください。コードを完全に記述する必要性を潜在的に回避できます。

PyPdf2 githubも includes マージを示すコード例です。

130
Paul Rooney

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)
6
Martin Thoma

Dirに存在するすべてのPDFファイルをマージします

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)
6
Giovanni Python

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著者です。

5
Patrick Maupin

ここで、 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"))
2
Mark K
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

2

柔軟性を高めるために辞書を使用するわずかなバリエーション(ソート、重複除去など):

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")
0
Ogaga Uzoh