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에 기재되어 있습니다.
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"))
코드 예는 (매뉴얼에서 발췌) 다음과 같습니다.
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")
하시면 됩니다.PdfFileMerger
PyPDF2 모듈로 이동합니다.
예를 들어 경로 목록에서 여러 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
'programing' 카테고리의 다른 글
CSS는 항상 JavaScript보다 앞서야 합니까? (0) | 2022.11.27 |
---|---|
해석 오류: 구문 오류, 내 PHP 코드의 예기치 않은 파일 끝 (0) | 2022.11.27 |
요소에서 텍스트 선택(마우스로 강조 표시) (0) | 2022.11.27 |
특정 길이까지 문자열 반복 (0) | 2022.11.07 |
팬더는 열 이름만 사용하여 빈 데이터 프레임을 생성합니다. (0) | 2022.11.07 |