programing

PDF 파일 병합

luckcodes 2022. 11. 27. 20:02

PDF 파일 병합

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

그렇다면 좀 더 늘려야겠네요.디렉토리내의 폴더를 루프 해, 이 순서를 반복합니다.

그리고 제가 운을 시험하고 있을지도 모르지만, 각 PDF에 포함된 페이지를 제외할 수 있을까요(내 보고서 생성은 항상 여분의 공백 페이지를 만듭니다).

PyPdf2s 클래스를 사용할 수 있습니다.

파일 연결

이 방법을 사용하면 간단하게 파일을 연결할 수 있습니다.

from PyPDF2 import PdfMerger

pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf']

merger = PdfMerger()

for pdf in pdfs:
    merger.append(pdf)

merger.write("result.pdf")
merger.close()

원하는 경우 파일 경로 대신 파일 핸들을 전달할 수 있습니다.

파일 병합

병합의 보다 세밀한 제어를 원하는 경우, 다음과 같은 방법이 있습니다.PdfMerger출력 파일에 삽입 포인트를 지정할 수 있습니다.즉, 파일내의 임의의 장소에 페이지를 삽입할 수 있습니다.append은 방이 method method method a a a a a라고 수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됩니다.close marge는 Marge를 종료합니다.이것에 의해, 모든 파일이 적시에 닫힙니다(입출력).PdfFileMerger 않기 에, 「컨텍스트 매니저」라고 하는 할 수 있습니다.with키워드를 지정하면 명시적인 클로즈 콜을 회피하고 간단한 예외 안전성을 얻을 수 있습니다.

pypdf2의 일부로 제공되는 스크립트를 참조할 수도 있습니다.코드를 모두 쓸 필요가 없어질 수 있습니다.

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

PyMuPdf

볼만한 또 다른 라이브러리는 PyMuPdf입니다.병합도 마찬가지로 간단합니다.

명령줄에서:

python -m fitz join -o result.pdf file1.pdf file2.pdf file3.pdf

및 코드로부터

import fitz

result = fitz.open()

for pdf in ['file1.pdf', 'file2.pdf', 'file3.pdf']:
    with fitz.open(pdf) as mfile:
        result.insertPDF(mfile)
    
result.save("result.pdf")

다양한 옵션이 준비되어 있으며 자세한 내용은 프로젝트 Wiki에 기재되어 있습니다.

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()
        output_stream.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)

dir에 있는 모든 PDF 파일을 병합합니다.

PDF 파일을 dir에 넣습니다.프로그램을 기동합니다.모든 pdf가 병합된 PDF가 1개 표시됩니다.

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)

오늘 위와 같은 코드를 만들려면 어떻게 해야 합니까?

from glob import glob
from PyPDF2 import PdfFileMerger



def pdf_merge():
    ''' Merges all the pdf files in current directory '''
    merger = PdfFileMerger()
    allpdfs = [a for a in glob("*.pdf")]
    [merger.append(pdf) for pdf in allpdfs]
    with open("Merged_pdfs.pdf", "wb") as new_file:
        merger.write(new_file)


if __name__ == "__main__":
    pdf_merge()

북마크와 주석을 보존할 필요가 없고 PDF가 암호화되지 않은 경우 라이브러리는 를 매우 쉽게 수행할 수 있습니다.cat.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 파일을 Marge할 수 있습니까?

네.

다음 예제에서는 한 폴더의 모든 파일을 단일 새 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 Repo : 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"))

pikpdf(소스 코드 문서)도 사용할 수 있습니다.

코드 예는 (매뉴얼에서 발췌) 다음과 같습니다.

from glob import glob

from pikepdf import Pdf

pdf = Pdf.new()

for file in glob('*.pdf'):  # you can change this to browse directories recursively
    with Pdf.open(file) as src:
        pdf.pages.extend(src.pages)

pdf.save('merged.pdf')
pdf.close()

는, 예를 , 새로운 에 하는 등, 다른 할 수 할 수 ).그러면, 「」, 「PDF」, 「PDF」를 할 수 있습니다).pdf.pages리)

2022년 2월 현재 PyPDF2나 pdfrw의 경우는 아닌 것으로 보인다.

벤치마크를 하지 않았기 때문에 다른 솔루션보다 빠른지 느린지 알 수 없습니다.

제 경우 PyMuPDF에 비해 한 가지 장점은 Ubuntu 공식 패키지(python3-pikepdf)를 사용할 수 있다는 것입니다.이 패키지에 따라 소프트웨어를 패키징할 수 있습니다.

사전 사용을 통한 약간의 변화(예: 정렬, 중복 배제):

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

하시면 됩니다.PdfFileMergerPyPDF2 모듈로 이동합니다.

예를 들어 경로 목록에서 여러 PDF 파일을 병합하려면 다음 기능을 사용할 수 있습니다.

from PyPDF2 import PdfFileMerger

# pass the path of the output final file.pdf and the list of paths
def merge_pdf(out_path: str, extracted_files: list [str]):
    merger   = PdfFileMerger()
    
    for pdf in extracted_files:
        merger.append(pdf)

    merger.write(out_path)
    merger.close()

merge_pdf('./final.pdf', extracted_files)

또한 이 함수는 부모 폴더에서 모든 파일을 반복적으로 가져옵니다.

import os

# pass the path of the parent_folder
def fetch_all_files(parent_folder: str):
    target_files = []
    for path, subdirs, files in os.walk(parent_folder):
        for name in files:
            target_files.append(os.path.join(path, name))
    return target_files 

# get a list of all the paths of the pdf
extracted_files = fetch_all_files('./parent_folder')

선언하는 두 a 지 、 마 、 마 、 finally 、 finally 、 finally 、 finally 、 finally 、parent_folder_path여러 개의 문서를 포함할 수 있으며,output_pdf_path(Marge된 PDF의 수신처에 대해):

# get a list of all the paths of the pdf
parent_folder_path = './parent_folder'
outup_pdf_path     = './final.pdf'

extracted_files = fetch_all_files(parent_folder_path)
merge_pdf(outup_pdf_path, extracted_files)

여기서 완전한 코드를 입수할 수 있습니다(소스).Python을 사용하여 PDF 문서를 병합하는 방법

서브프로세스(1.pdf 와 2.pdf 가 디렉토리에 존재하는 것을 전제로 한다)를 이용하여 pdf 를 Linux 터미널 상에서 unity 를 사용했는데, 그 목적은 그것들을 3.pdf 로 Marge 하는 것입니다.

 import subprocess
 subprocess.call(['pdfunite one.pdf two.pdf three.pdf'],shell=True)

Giovanni G. PY의 답변은 (적어도 나에게는) 쉽게 사용할 수 있습니다.

import os
from PyPDF2 import PdfFileMerger

def merge_pdfs(export_dir, input_dir, folder):
    current_dir = os.path.join(input_dir, folder)
    pdfs = os.listdir(current_dir)
    
    merger = PdfFileMerger()
    for pdf in pdfs:
        merger.append(open(os.path.join(current_dir, pdf), 'rb'))

    with open(os.path.join(export_dir, folder + ".pdf"), "wb") as fout:
        merger.write(fout)

export_dir = r"E:\Output"
input_dir = r"E:\Input"
folders = os.listdir(input_dir)
[merge_pdfs(export_dir, input_dir, folder) for folder in folders];

다음은 특정 사용 사례에 대한 가장 일반적인 답변의 시간 비교입니다. 5개의 큰 단일 페이지 PDF 파일 목록을 조합한 것입니다.각 테스트를 두 번 실행했습니다.

(면책자:플라스크 내에서 이 기능을 실행했는데 주행거리가 다를 수 있습니다.)

TL;DR

pdfrw테스트한 3개의 라이브러리 중 pdf를 조합하는 속도가 가장 빠른 라이브러리입니다.

PyPDF2

start = time.time()
merger = PdfFileMerger()
for pdf in all_pdf_obj:
    merger.append(
        os.path.join(
            os.getcwd(), pdf.filename # full path
                )
            )
formatted_name = f'Summary_Invoice_{date.today()}.pdf'
merge_file = os.path.join(os.getcwd(), formatted_name)
merger.write(merge_file)
merger.close()
end = time.time()
print(end - start) #1 66.50084733963013 #2 68.2995400428772

PyMuPDF

start = time.time()
result = fitz.open()

for pdf in all_pdf_obj:
    with fitz.open(os.path.join(os.getcwd(), pdf.filename)) as mfile:
        result.insertPDF(mfile)
formatted_name = f'Summary_Invoice_{date.today()}.pdf'

result.save(formatted_name)
end = time.time()
print(end - start) #1 2.7166640758514404 #2 1.694727897644043

pdfrw

start = time.time()
result = fitz.open()

writer = PdfWriter()
for pdf in all_pdf_obj:
    writer.addpages(PdfReader(os.path.join(os.getcwd(), pdf.filename)).pages)

formatted_name = f'Summary_Invoice_{date.today()}.pdf'
writer.write(formatted_name)
end = time.time()
print(end - start) #1 0.6040127277374268 #2 0.9576816558837891

def pdf_merger(path): "pdfs를 하나의 pdf로 병합합니다."

import logging
logging.basicConfig(filename = 'output.log', level = logging.DEBUG, format = '%(asctime)s %(levelname)s %(message)s' )

try:
    import glob, os
    import PyPDF2
    
    os.chdir(path)
    
    pdfs = []
    
    for file in glob.glob("*.pdf"):
        pdfs.append(file)
        
    if len(pdfs) == 0:
        logging.info("No pdf in the given directory")
        
    else:
        merger = PyPDF2.PdfFileMerger()
        
        for pdf in pdfs:
            merger.append(pdf)
            
        merger.write('result.pdf')
        merger.close()
        
except Exception as e:
    logging.error('Error has happened')
    logging.exception('Exception occured' + str(e))

언급URL : https://stackoverflow.com/questions/3444645/merge-pdf-files