পিডিএফ ফাইলগুলি মার্জ করুন


126

পাইথন ব্যবহার করে পৃথক পিডিএফ ফাইলগুলি একত্রিত করা কি সম্ভব?

ধরে নিচ্ছি, আমার এটি আরও কিছুটা বাড়ানো দরকার। আমি কোনও ডিরেক্টরিতে ফোল্ডারগুলি লুপ করব এবং এই পদ্ধতিটি পুনরাবৃত্তি করব।

এবং আমি আমার ভাগ্যকে চাপ দিচ্ছি, তবে পিডিএফ-এর অন্তর্ভুক্ত কোনও পৃষ্ঠা বাদ দেওয়া কি সম্ভব (আমার প্রতিবেদন প্রজন্ম সর্বদা একটি অতিরিক্ত ফাঁকা পৃষ্ঠা তৈরি করে)।

উত্তর:


122

পিপডিএফ বা তার উত্তরসূরি পিআইপিডিএফ 2 ব্যবহার করুন :

পিডিএফ টুলকিট হিসাবে নির্মিত একটি খাঁটি-পাইথন লাইব্রেরি। এটি সক্ষম:
* পৃষ্ঠায় বিভক্ত নথির পাতা,
* নথির পৃষ্ঠায় পৃষ্ঠাটি মার্জ করা,

(এবং আরো অনেক কিছু)

এখানে একটি নমুনা প্রোগ্রাম যা উভয় সংস্করণের সাথে কাজ করে।

#!/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 যা পাইপিডিএফ- এর উত্তরসূরি প্রকল্প
ডেভিড ফ্রেজার

আমার জন্য কেবল বাইনারি মোডে খোলার সাথে কাজ করে (ইনপুট স্ট্রিম এবং আউটপুট স্ট্রিম)। open(input_file), 'r+b', এবং sys.stdout পরিবর্তে আমি ব্যবহার করি output_stream = open('result.pdf', 'w+b')
সাইমন বোরকো

@ সাইমনবার্কো ড্রপ দ্য +, এর অর্থ "পড়া এবং লিখুন" এবং উভয়ই ফাইল পড়া এবং লিখিত নয়। আমি স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 2374427/… এর ভিত্তিতে উইন্ডোজ সমর্থন আউটপুট সমর্থন যুক্ত করেছি ।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

পাইপিডিএফ 2/3 স্থিতিশীল নয়, আমি পিপিডিএফ 2/3 ছাড়া পিডিএফ ফাইলগুলিকে কীভাবে মার্জ করতে পারি।
GoingMyWay

2
আমাকে sys.stdout.bufferপাইথন ৩.6.৮ (লিনাক্স)
গ্রীশ্যাক

197

আপনি পাইপডিএফ 2 এর 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, ফর্ম একটি tuple ক্ষণস্থায়ী (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কীওয়ার্ডটি ব্যবহার করতে পারি , সুস্পষ্ট কাছাকাছি কল এড়াতে পারি এবং কিছু সহজ ব্যতিক্রমী সুরক্ষা পেতে পারি।

আপনি pdfcatপিআইপিডিএফ 2 এর অংশ হিসাবে সরবরাহিত স্ক্রিপ্টটিও দেখতে চাইতে পারেন । আপনি সম্পূর্ণরূপে কোড লেখার প্রয়োজনীয়তা এড়াতে পারবেন।

পাইপডিএফ 2 গিথুব এছাড়াও মার্জ করে প্রদর্শিত কিছু উদাহরণ কোড অন্তর্ভুক্ত করে।


14

একটি পীরস্থলে উপস্থিত সমস্ত পিডিএফ ফাইলগুলি মার্জ করুন

পিডিএফ ফাইলগুলি একটি ডিয়ারে রাখুন। প্রোগ্রাম চালু করুন. আপনি সমস্ত পিডিএফ একত্রিত হয়ে একটি পিডিএফ পাবেন।

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
এটি সবচেয়ে স্থিতিশীল।
যাচ্ছেন মাইওয়াই

1
এই গ্রন্থাগারটি আরও সুনামের দাবিদার।
GoingMyWay

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

গিট রেপো: https://github.com/mahaguru24/Python_Merge_PDF.git


2

এখানে, http://pieceofpy.com/2009/03/05/concateating-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

আমি লিনাক্স টার্মিনালে উপ-প্রসেসটি উপার্জনের মাধ্যমে পিডিএফ ইউনিট ব্যবহার করেছি (ধরে নিই ডিরেক্টরিতে one.pdf এবং two.pdf বিদ্যমান) এবং লক্ষ্যটি তাদের থ্রি.পিডিএফতে একীভূত করা

 import subprocess
 subprocess.call(['pdfunite one.pdf two.pdf three.pdf'],shell=True)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.