답변:
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)
open(input_file), 'r+b'
, sys.stdout 대신 output_stream = open('result.pdf', 'w+b')
.
+
"읽기 및 쓰기"를 의미하며 두 파일 모두 읽기와 쓰기가 모두 수행되지 않습니다. stackoverflow.com/questions/2374427/…을 기반으로 Windows 지원 출력 지원을 추가했습니다 .
sys.stdout.buffer
Python 3.6.8 (Linux) 을 사용해야했습니다
당신은 사용할 수 있습니다 PyPdf2 의 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 페이지에 삽입합니다.
페이지 범위
특정 파일에서 추가되는 페이지를 제어하려면 and 의 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
키워드를 사용 하고 명시적인 닫기 호출을 피하고 쉽게 예외 안전을 얻을 수 있습니다.
pdfcat
pypdf2의 일부로 제공되는 스크립트 를 살펴볼 수도 있습니다 . 잠재적으로 코드를 모두 작성할 필요가 없습니다.
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)
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
저자입니다.
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)
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
여기 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"))
유연성을 높이기 위해 사전을 사용하는 약간의 변형 (예 : 정렬, 중복 제거) :
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")
나는 하위 프로세스를 활용하여 리눅스 터미널에서 pdf unite를 사용했고 (1.pdf와 two.pdf가 디렉토리에 존재한다고 가정) 목표는 그들을 three.pdf로 병합하는 것입니다.
import subprocess
subprocess.call(['pdfunite one.pdf two.pdf three.pdf'],shell=True)