PDF 파일 병합


126

Python을 사용하여 별도의 PDF 파일을 병합 할 수 있습니까?

그렇게 가정하면 이것을 조금 더 확장해야합니다. 디렉토리의 폴더를 반복하고이 절차를 반복하고 싶습니다.

운이 좋을 수도 있지만 PDF에 포함 된 페이지를 제외 할 수 있습니다 (내 보고서 생성은 항상 추가 빈 페이지를 생성 함).

답변:


122

사용 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
        # /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)

19
그리고 지금, pypi.python.org/pypi/PyPDF2 이는 PyPDF의 후속 프로젝트입니다
데이비드 프레이저

바이너리 모드 (입력 스트림 및 출력 스트림)에서 열 때만 저에게 적합합니다. open(input_file), 'r+b', sys.stdout 대신 output_stream = open('result.pdf', 'w+b').
Simeon Borko

@SimeonBorko를 드롭하면 +"읽기 및 쓰기"를 의미하며 두 파일 모두 읽기와 쓰기가 모두 수행되지 않습니다. stackoverflow.com/questions/2374427/…을 기반으로 Windows 지원 출력 지원을 추가했습니다 .
질 'SO-정지 존재 악마'

PyPDF2 / 3이 안정적이지 않습니다. PyPDF2 / 3없이 pdf 파일을 병합하려면 어떻게해야합니까?
GoingMyWay

2
sys.stdout.bufferPython 3.6.8 (Linux) 을 사용해야했습니다
Greyshack

197

당신은 사용할 수 있습니다 PyPdf2PdfMerger클래스를.

파일 연결

메서드 를 사용하여 파일을 간단히 연결할 수 있습니다 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 페이지에 삽입합니다.

페이지 범위

특정 파일에서 추가되는 페이지를 제어하려면 and 의 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.

참고 : 또한 파일이 열려있는 것을 방지 PdfFileMerger하려면 병합 된 파일이 작성 될 때 s close 메소드를 호출해야합니다. 이렇게하면 모든 파일이 적시에 닫히게됩니다 (입력 및 출력). PdfFileMerger컨텍스트 관리자로 구현되지 않은 것은 부끄러운 일이므로 with키워드를 사용 하고 명시적인 닫기 호출을 피하고 쉽게 예외 안전을 얻을 수 있습니다.

pdfcatpypdf2의 일부로 제공되는 스크립트 를 살펴볼 수도 있습니다 . 잠재적으로 코드를 모두 작성할 필요가 없습니다.

PyPdf2 github 에는 병합을 보여주는 몇 가지 예제 코드 도 포함되어 있습니다.


14

디렉토리에있는 모든 pdf 파일 병합

pdf 파일을 dir에 넣으십시오. 프로그램을 시작하십시오. 모든 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)

8

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저자입니다.


1
이것은 가장 안정적인 것입니다.
GoingMyWay

1
이 도서관은 더 많은 명성을 얻을 가치가 있습니다.
GoingMyWay

6

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)

3
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

여기 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"))

0

유연성을 높이기 위해 사전을 사용하는 약간의 변형 (예 : 정렬, 중복 제거) :

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

나는 하위 프로세스를 활용하여 리눅스 터미널에서 pdf unite를 사용했고 (1.pdf와 two.pdf가 디렉토리에 존재한다고 가정) 목표는 그들을 three.pdf로 병합하는 것입니다.

 import subprocess
 subprocess.call(['pdfunite one.pdf two.pdf three.pdf'],shell=True)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.