पायथन का उपयोग करके मौजूदा पीडीएफ में पाठ जोड़ें


106

मुझे पायथन का उपयोग करके मौजूदा पीडीएफ में कुछ अतिरिक्त पाठ जोड़ने की आवश्यकता है, इस बारे में जाने का सबसे अच्छा तरीका क्या है और मुझे कौन से अतिरिक्त मॉड्यूल स्थापित करने की आवश्यकता होगी।

नोट: आदर्श रूप से मैं इसे विंडोज और लिनक्स दोनों पर चलाने में सक्षम होना चाहता हूं, लेकिन एक धक्का लिनक्स पर केवल यही करेगा।

संपादित करें: pyPDF और रिपोर्टलैब अच्छे लगते हैं, लेकिन न तो मुझे एक मौजूदा पीडीएफ को संपादित करने की अनुमति देगा, क्या कोई अन्य विकल्प हैं?

जवाबों:


88

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैंने इसका हल खोजने की कोशिश में लंबा समय बिताया। मैं केवल रिपोर्टलैब और PyPDF का उपयोग करके एक सभ्य व्यक्ति के रूप में आया था, इसलिए मैंने सोचा कि मैं साझा करूँगा:

  1. अपने पीडीएफ का उपयोग करके पढ़ें PdfFileReader(), हम इस इनपुट को कॉल करेंगे
  2. ReportLab का उपयोग करने के लिए अपने पाठ से युक्त एक नया पीडीएफ़ बनाएं, इसे एक स्ट्रिंग ऑब्जेक्ट के रूप में सहेजें
  3. स्ट्रिंग ऑब्जेक्ट का उपयोग करके पढ़ें PdfFileReader(), हम इस पाठ को कॉल करेंगे
  4. एक नया पीडीएफ ऑब्जेक्ट बनाएं PdfFileWriter(), हम इस आउटपुट को कॉल करेंगे
  5. इनपुट के माध्यम से पुनरावृत्त करें और उस .mergePage(*text*.getPage(0))प्रत्येक पृष्ठ के लिए आवेदन करें जिसे आप पाठ जोड़ना चाहते हैं, फिर output.addPage()संशोधित पृष्ठों को एक नए दस्तावेज़ में जोड़ने के लिए उपयोग करें

यह सरल पाठ परिवर्धन के लिए अच्छी तरह से काम करता है। किसी दस्तावेज़ को वॉटरमार्क करने के लिए PyPDF का नमूना देखें।

नीचे दिए गए प्रश्न का उत्तर देने के लिए कुछ कोड दिए गए हैं:

packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
<do something with canvas>
can.save()
packet.seek(0)
input = PdfFileReader(packet)

यहां से आप इनपुट फ़ाइल के पृष्ठों को किसी अन्य दस्तावेज़ के साथ मर्ज कर सकते हैं।


2
"ReportLab का उपयोग करके जोड़ने के लिए अपने पाठ से युक्त एक नया पीडीएफ बनाएं, इसे एक स्ट्रिंग ऑब्जेक्ट के रूप में सहेजें" आप ऐसा कैसे करते हैं? इसका कैनवास उदाहरण है।
लक्ष्मण प्रसाद

1
मैंने लक्ष्मण के प्रश्न का उत्तर देने के लिए ऊपर कुछ नमूना कोड जोड़े हैं।
dwelch 15

: मैं PyPDF2 का उपयोग करना चाहिये, क्योंकि यह अधिक अद्यतन किया जाता है, भी अपने नमूना कोड की जाँच github.com/mstamy2/PyPDF2/blob/...
जलते

2
यह कोड एक नई पीडीएफ फाइल बनाएगा और सभी मेटाडेटा को छोड़ देगा। तो यह मौजूदा पीडीएफ के लिए संलग्न नहीं है।
एंटोन कुकोबा

124

[अजगर 2.7] के लिए उदाहरण:

from pyPdf import PdfFileWriter, PdfFileReader
import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = StringIO.StringIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(file("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = file("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

पायथन 3.x के लिए उदाहरण:


from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = io.BytesIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(open("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

13
Python3 के लिए, पैकेट होना चाहिए io.BytesIOऔर pyPDF के बजाय PyPDF2 का उपयोग करना चाहिए (जो अचूक है)। बहुत बढ़िया जवाब!
नूफ़ल इब्राहिम

4
साझा करने के लिए धन्यवाद। यह बहुत अच्छा काम करता है। एक नोट: मेरा मानना ​​है कि इसके openबजाय इसका उपयोग करना बेहतर है file
मितेनका

मेरा मानना ​​है कि यह एक अधिक स्वीकार्य उत्तर है, विशेष रूप से क्योंकि इसमें एक कार्यशील उदाहरण शामिल है।
केसी

1
सावधान: नए दस्तावेज़ में केवल मूल का पहला पृष्ठ शामिल है! यह से शेष पृष्ठों की नकल करने के लिए आसान पर्याप्त है existing_pdfकरने के लिए output, नमूना कोड सिर्फ ऐसा नहीं करता।
एलेक्सिस

@alexis: आप पीडीएफ के दूसरे पृष्ठ पर कुछ डालने के लिए कोड को कैसे संशोधित करेंगे? मेरे पास एक फ़ॉर्म है जो दो पृष्ठों का उपयोग करता है और मैं पहले पृष्ठ पर अटक गया हूं। अग्रिम में धन्यवाद।
डेविड वीवी

11

pdfrw आपको मौजूदा PDF के पृष्ठों को पढ़ने देगा और उन्हें एक रिपोर्टलैब कैनवास (चित्र बनाने के समान) में खींचेगा। इसके लिए उदाहरण हैं pdfrw उदाहरण / glub पर rl1 उपनिर्देशिका। अस्वीकरण: मैं pdfrw लेखक हूं।


मुझे लगता है कि आप वहां एक लिंक डाल सकते हैं
The6thSense

अच्छी बात! जब मैंने पोस्ट किया था तो मैंने बहुत अधिक सामान नहीं किया था, और "न्यूनतम पाठ प्लस लिंक नीति" के बारे में चिंतित था। (उस समय मेरा प्रतिनिधि केवल 46 था, और IIRC मुझे सिर्फ एक उत्तर पर -2 प्राप्त हुआ था, इसलिए मैं 5 साल पुराने प्रश्नों पर नए उत्तरों को लेकर थोड़ा चिंतित था :)
पैट्रिक मौपिन

पुराने प्रश्नों को अधिक देखने :) और ध्यान मिलता है
The6thSense

यदि आप इस लिंक का अनुसरण करना शुरू करते हैं, तो FWIW, कुछ और रिपोर्टलैब / pdfrw उदाहरण हैं । मैंने वहां जवाब दिया, जो कि डूप लक्ष्य में एक उत्तर पर आधारित था।
पैट्रिक मौपिन

7

इस्तेमाल डेविड Dehghan के जवाब से ऊपर, अजगर 2.7.13 में निम्न काम करता है:

from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger

import StringIO

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = StringIO.StringIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(290, 720, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader("original.pdf")
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

3

cpdf कमांड-लाइन से काम करेगा। यह अजगर नहीं है, हालांकि (afaik):

cpdf -add-text "Line of text" input.pdf -o output .pdf

0

आपके पास पीडीएफ को एक संपादन योग्य प्रारूप में परिवर्तित करने, अपने परिवर्तनों को लिखने, फिर इसे पीडीएफ में वापस परिवर्तित करने में बेहतर किस्मत हो सकती है। मैं एक ऐसी लाइब्रेरी के बारे में नहीं जानता जो आपको पीडीएफ को सीधे संपादित करने की अनुमति देती है लेकिन उदाहरण के लिए DOC और PDF के बीच बहुत सारे कन्वर्टर्स हैं।


1
समस्या यह है कि मेरे पास केवल पीडीएफ में स्रोत (एक 3 पार्टी से) और पीडीएफ -> डीओसी -> पीडीएफ रूपांतरण में बहुत कुछ खो देगा। इसके अलावा मुझे लिनक्स पर चलने के लिए इसकी आवश्यकता है ताकि DOC सबसे अच्छा विकल्प न हो।
Frozenskys

मेरा मानना ​​है कि एडोब पीडीएफ संपादन क्षमता को बहुत बंद और मालिकाना रखता है ताकि वे एक्रोबैट के अपने बेहतर संस्करणों के लिए लाइसेंस बेच सकें। हो सकता है कि आप कुछ प्रकार के मैक्रो इंटरफ़ेस का उपयोग करके, इसे संपादित करने के लिए एक्रोबैट प्रो के उपयोग को स्वचालित करने का एक तरीका पा सकते हैं।
ऐहलके जुले

यदि आप जो भाग लिखना चाहते हैं, वे फार्म फ़ील्ड हैं, तो उन्हें संपादित करने के लिए XML इंटरफेस हैं - अन्यथा मुझे कुछ भी नहीं मिल रहा है।
ऐहलके जुले

नहीं, मैं सिर्फ प्रत्येक पृष्ठ पर पाठ की कुछ पंक्तियाँ जोड़ना चाहता था।
फ्रोज़ेन्स्किस

0

यदि आप विंडोज पर हैं, तो यह काम कर सकता है:

पीडीएफ निर्माता पायलट

पाइथन में पीडीएफ निर्माण और संपादन रूपरेखा का एक श्वेतपत्र भी है। यह थोड़ा दिनांकित है, लेकिन शायद आपको कुछ उपयोगी जानकारी दे सकता है:

पीडीएफ एडिटिंग और प्रोसेसिंग फ्रेमवर्क के रूप में पायथन का उपयोग करना


श्वेत पत्र अच्छा लग रहा है, लेकिन कोड पर थोड़ा प्रकाश है, और मेरे पास वास्तव में पूरे पीडीएफ ढांचे को लागू करने के लिए संसाधन नहीं हैं! ;)
फ्रोज़ेन्स्की

-4

क्या आपने pyPdf की कोशिश की है ?

क्षमा करें, इसमें पृष्ठ की सामग्री को संशोधित करने की क्षमता नहीं है।


लगता है कि यह काम कर सकता है, क्या किसी ने इसका इस्तेमाल किया है? स्मृति उपयोग की तरह क्या है?
फ्रोज़ेन्स्किस

इसमें एक पाठ वॉटरमार्क जोड़ने की क्षमता है और अगर इसे ठीक से स्वरूपित किया गया तो यह काम कर सकता है।
फ्रोज़ेन्स्किस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.