2014-05-23 7 views
9

में इन-डॉक्यूमेंट लिंक जोड़ें मुझे कई (सैकड़ों) पीडीएफ दस्तावेजों का प्रोग्रामेटिक विश्लेषण और गठबंधन करने की ज़रूरत है, और पृष्ठों को विशेष तरीकों से एक साथ जोड़ना है। प्रत्येक पीडीएफ में प्रत्येक स्थान पर टेक्स्ट शामिल होता है जहां एक लिंक संबंधित होता है, यह दर्शाता है कि इसे किस लिंक से लिंक करना चाहिए। मैं स्थान और टेक्स्ट निकालने के लिए pdfminer का उपयोग कर रहा हूं जहां लिंक होना चाहिए; अब मुझे वास्तव में उन लिंक बनाने की जरूरत है।पीडीएफ

मैंने कुछ शोध किया है और निष्कर्ष निकाला है कि PyPDF2 ऐसा माना जा सकता है। किसी भी दर पर, एक प्रतीत होता है-सीधा addLink विधि जो काम पूरा करने का दावा करती है। मैं इसे काम करने के लिए नहीं मिल सकता है।

from PyPDF2 import PdfFileWriter 
from PyPDF2.pdf import RectangleObject 

out = PdfFileWriter() 

out.insertBlankPage(800, 1000) 
out.insertBlankPage(800, 1000) 

# rect = [400, 400, 600, 600] # This doesn't seem to work either 
rect = RectangleObject([400, 400, 600, 600]) 
out.addLink(0, 1, rect) # link from first to second page 

with open(r'C:\temp\test.pdf', 'wb') as outf: 
    out.write(outf) 

ऊपर दिया गया कोड एक सुंदर दो-पेज पीडीएफ उत्पन्न करता है जिसमें कम से कम जहां तक ​​मैं कह सकता हूं। क्या वहां कोई भी जानता है कि यह कैसे पूरा किया जा सकता है? या कम से कम एक संकेत जहां मैं गलत जा रहा हूँ?

एक समाधान को पीईपीडीएफ 2 का उपयोग करने की आवश्यकता नहीं है, जब तक लाइब्रेरी स्वतंत्र रूप से लाइसेंस प्राप्त हो। कड़ाई से बोलते हुए, पायथन भी एक आवश्यकता नहीं है, लेकिन यह मेरी वर्तमान संरचना में फिट करने के लिए अच्छा होगा, बिना किसी दूसरी भाषा को हैक किए।

उत्तर

5

यह addLink के कार्यान्वयन में एक बग प्रतीत होता है, या संभवतः यह विधि केवल पुराने या अलग लिंक वाक्यविन्यास के लिए है।

6 0 obj 
<< 
/Dest [ 4 0 R /FitV 826 ] 
/Type /Annot 
/Rect RectangleObject([400, 400, 600, 600]) 
/Border [ 0 0 0 ] 
/P IndirectObject(5, 0) 
/Subtype /Link 
>> 

इस के साथ कई समस्याएं हैं: जो भी हो, सवाल में उदाहरण कोड से उत्पादन पीडीएफ की संरचना का निरीक्षण इस छोटे से मणि पता चलता है। सबसे स्पष्ट यह है कि RectangleObject और IndirectObject पायथन पुस्तकालय, वैध पीडीएफ संरचनाओं के निर्माण नहीं हैं। /Dest पर भी एक रहस्यमय जादू पैरामीटर लगता है जिस पर मैंने नहीं पूछा था। इसके अलावा, /P अनावश्यक होगा (उस पृष्ठ का संदर्भ जिसमें इस लिंक को शामिल किया गया है), भले ही इसे इस तरह से कार्यान्वित किया गया हो जिसने पाइथन संरचना को पीडीएफ संरचना में थप्पड़ नहीं दिया। तो संक्षेप में, इसमें कोई आश्चर्य की बात नहीं है कि यह लिंक टूटा हुआ है।

आसपास के स्रोत के साथ क्रैश होने त्रुटियों को खत्म करने के लिए थोड़ा खिलवाड़, यह पता चला है कि दो परिवर्तनों की आवश्यकता है * आदेश काम कर में लिंक प्राप्त करने के लिए: एक ArrayObject करने के लिए एक NameObject से /Rect के आंतरिक प्रतिनिधित्व बदल रहा है, और बदलते /P वास्तविक वस्तु के बजाए पृष्ठ संख्या पर इंगित करने के लिए संदर्भ।

6 0 obj 
<< 
/Dest [ 4 0 R /FitV ] 
/Type /Annot 
/Rect [ 400 400 600 600 ] 
/Border [ 0 0 0 ] 
/P 0 
/Subtype /Link 
>> 

एट देखा, कड़ी के रूप में उत्पादन में वास्तव में उम्मीद से काम करता है: इन परिवर्तनों उदाहरण कोड मान्य उत्पादन का उत्पादन करते हैं! मैंने /Rect मान से जादू 826 को भी हटा दिया है, क्योंकि यह ज़ूम स्तर के आधार पर एक कानूनी पैरामीटर नहीं हो सकता है, और इसे वास्तव में कड़ी-कोडित नहीं किया जाना चाहिए।


* समापन यह सुधार अपेक्षित तरीके से काम उसके बाद, मैं यह पता लगाने की थी कि /Rect एक NameObject के रूप में छोड़ रहा है और यह एक स्ट्रिंग कि उत्पादन (जैसे '[ 400 400 600 600 ]') भी काम करेंगे चाहिए की तरह लग रहा गुजर। यह संभवतः अधिकतम लचीलापन की अनुमति देने का इरादा है, लेकिन यह निश्चित रूप से अप्रत्याशित है।


अद्यतन: मैं एक साथ रखा और एक अधिक संपूर्ण सुधार (link to the patch भावी पीढ़ी के लिए) प्रस्तुत है, इसलिए मुद्दों के ऊपर सभी संस्करण 1.22 के रूप में, किया जाना चाहिए।