पीडीएफ फाइलों को मर्ज करें


126

क्या यह संभव है, अजगर का उपयोग करके, अलग-अलग पीडीएफ फाइलों को मर्ज किया जाए?

ऐसा मानते हुए, मुझे इसे थोड़ा और आगे बढ़ाने की आवश्यकता है। मैं एक निर्देशिका में फ़ोल्डरों के माध्यम से लूप की उम्मीद कर रहा हूं और इस प्रक्रिया को दोहराता हूं।

और मैं अपनी किस्मत को आगे बढ़ा सकता हूं, लेकिन क्या यह एक पृष्ठ को बाहर करना संभव है जो पीडीएफ में निहित है (मेरी रिपोर्ट पीढ़ी हमेशा एक अतिरिक्त खाली पेज बनाती है)।

जवाबों:


122

Pypdf या इसके उत्तराधिकारी PyPDF2 का उपयोग करें :

एक शुद्ध-पायथन पुस्तकालय एक पीडीएफ टूलकिट के रूप में बनाया गया है। यह सक्षम है:
* पेज द्वारा दस्तावेज़ों को विभाजित करना,
* पेज द्वारा दस्तावेज़ पृष्ठ को मर्ज करना,

(और भी बहुत कुछ)

यहां एक नमूना कार्यक्रम है जो दोनों संस्करणों के साथ काम करता है।

#!/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')
शिमोन बोरको

@SimeonBorko ड्रॉप +, इसका मतलब है "पढ़ें और लिखें" और न ही फ़ाइल को पढ़ा और लिखा दोनों है। मैंने stackoverflow.com/questions/2374427/… के आधार पर Windows समर्थन आउटपुट समर्थन जोड़ा है ।
गिल्स एसओ- बुराई को रोकना '

PyPDF2 / 3 स्थिर नहीं है, मैं PyPDF2 / 3 के बिना पीडीएफ फाइलों को कैसे मर्ज कर सकता हूं।
गोइंगमवाय

2
मुझे sys.stdout.bufferPython 3.6.8 (Linux)
Greyshack

197

आप उपयोग कर सकते हैं 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)

यहां हम पूरे पीडीएफ को आउटपुट में सम्मिलित करते हैं लेकिन पेज 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एस करीबी विधि को बुलाया जाना चाहिए जब मर्ज की गई फ़ाइल लिखी गई हो। यह सुनिश्चित करता है कि सभी फाइलें समय पर बंद (इनपुट और आउटपुट) हों। यह शर्म की बात है कि PdfFileMergerएक संदर्भ प्रबंधक के रूप में लागू नहीं किया जाता है, इसलिए हम withकीवर्ड का उपयोग कर सकते हैं , स्पष्ट करीबी कॉल से बच सकते हैं और कुछ आसान अपवाद सुरक्षा प्राप्त कर सकते हैं।

आप pdfcatpypdf2 के भाग के रूप में प्रदान की गई स्क्रिप्ट को देखना चाहते हैं । आप संभावित रूप से पूरी तरह से कोड लिखने से बच सकते हैं।

PyPdf2 github में विलय के प्रदर्शन के कुछ उदाहरण कोड भी शामिल हैं


14

एक dir में मौजूद सभी pdf फाइलों को मर्ज करें

एक dir में pdf files रखें। कार्यक्रम का शुभारंभ। आप सभी पीडीएफ़ मर्ज किए गए के साथ एक पीडीएफ प्राप्त करते हैं।

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पुस्तकालय काफी आसानी से यह कर सकते हैं, यह मानते हुए आप बुकमार्क और एनोटेशन को संरक्षित करने की जरूरत नहीं है, और अपने पीडीएफ़ एन्क्रिप्ट नहीं किए जाते। 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
यह सबसे अधिक स्थिर है।
गोइंगमवाय

1
यह पुस्तकालय अधिक प्रतिष्ठा का हकदार है।
गोइंगमवाय

6

क्या यह संभव है, पाइथन का उपयोग करके, पीडीएफ फाइलों को अलग करना?

हाँ।

निम्न उदाहरण एक फ़ोल्डर में सभी फाइलों को एक नई पीडीएफ फाइल में विलय करता है:

#!/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 Repo: 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 और दो निर्देशिका में मौजूद है) और उद्देश्य उन्हें तीन.पीड में विलय करना है

 import subprocess
 subprocess.call(['pdfunite one.pdf two.pdf three.pdf'],shell=True)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.