पीडीएफ फाइल के कोड को कैसे देखें और संपादित करें


12

मैं सोच रहा था कि पीडीएफ फाइल के कोड को कैसे देखा और संपादित किया जाए?

  1. देखने से, मैं द्विआधारी प्रारूप नहीं देखना चाहता, इसलिए मुझे लगता है कि जैसा hexdumpमैं चाहता हूं वैसा नहीं हो सकता। मैंने कोशिश की gedit, लेकिन पीडीएफ सामग्री को डिकोड करने के लिए कोई एन्कोडिंग विधि का उपयोग नहीं किया जा सकता है।

  2. संपादन करके, मैं खोज करना चाहूंगा /Fitऔर उन्हें /XYZउदाहरण के लिए sed में बदलूंगा। लेकिन मेरी कमांड sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfमेरे पीडीएफ की उपस्थिति को नहीं बदलती है जैसा कि मैंने उम्मीद की थी, हालांकि यह किसी भी त्रुटि की रिपोर्ट नहीं करता है। मैं सोच रहा था कि क्या sedवे वास्तव में पीडीएफ फाइलों पर काम कर सकते हैं जैसे कि वे सादे पाठ थे?

मेरे प्रश्नों का संदर्भ इस प्रश्न से पाया जा सकता है । मेरा OS उबंटू 10.10 है।

जवाबों:


9

आप sedबाइनरी फ़ाइलों के साथ उपयोग कर सकते हैं (कम से कम जीएनयू सेड; कुछ कार्यान्वयनों में अशक्त वर्णों वाली फ़ाइलों के साथ परेशानी हो सकती है या एक न्यूलाइन वर्ण के साथ समाप्त नहीं हो सकती है)। लेकिन आपके द्वारा उपयोग की जाने वाली कमांड केवल /Fitप्रत्येक पंक्ति की पहली घटना को प्रतिस्थापित करती है , और एक पीडीएफ फाइल में लाइनें बहुत अधिक अर्थहीन होती हैं। आपको सभी घटनाओं को प्रतिस्थापित करने की आवश्यकता है:

 sed s/\/Fit/\/XYZ/g

यह अधिक मजबूत होगा /Fitयदि यह एक शब्द घटक द्वारा पीछा नहीं किया जाता है (उदाहरण के लिए प्रतिस्थापित /Fitnessनहीं कर रहा है; मुझे नहीं पता है कि आपकी फ़ाइल में होने वाली /Fitसमस्याएं होती हैं)। यहाँ एक तरीका है:

perl -pe 's!/Fit\b!/XYZ!g'

धन्यवाद! अब यह काम करता है! (१) मैं सोच रहा था कि बाइनरी कंटेंट में सेड कैसे खोजते हैं? क्या खोज से पहले sed पहले क्वेरी वर्णों को कूटबद्ध करता है? (२) आखिरी आज्ञा में, क्या करता है !, \bऔर क्या gमतलब है? क्या यह बिना पर्ल के साथ सिर्फ सीड के साथ किया जा सकता है?
टिम

1
@ टिम (1) एसईडी डेटा को मेमोरी में लोड करता है, उस पर काम करता है और इसे प्रिंट करता है। इसे कुछ भी सांकेतिक करने की आवश्यकता क्यों होगी? (2) का gअर्थ है प्रत्येक पंक्ति में सभी घटनाओं को सेड और पर्ल दोनों में बदलना। !विभाजक है; आप sकमांड के लिए विभाजक के रूप में (लगभग) किसी भी वर्ण को चुन सकते हैं ( यह sed और perl दोनों में जाता है)। \bएक शब्द सीमा का मतलब है; यह पर्ल में मौजूद है, लेकिन सेड में नहीं।
गिल्स एसओ- बुराई को रोकें '

के बारे में (1), क्योंकि आप कमांड में जिन पात्रों को सीड करते हैं, वे मानव पठनीय हैं। यदि खोज करने के लिए सामग्री पूरी तरह से द्विआधारी है, तो sed वहां क्वेरी शब्द कैसे खोज सकता है?
टिम

@ समय पाठ बाइनरी डेटा है जो मानव पठनीय होने के लिए होता है।
गिल्स एसओ- बुराई को रोकना '

1
@ समय हाँ, आप क्वेरी में बाइनरी डेटा पास कर सकते हैं। आपको अपने sed या शेल सोर्स कोड में अक्षर अक्षर डालने होंगे।
गिल्स एसओ- बुराई को रोकें '

17

आपके पहले प्रश्न के बारे में ("स्रोत कोड को देखना, लेकिन कोई बाइनरी नहीं"): कुछ विकल्प हैं जो आपके पास आंतरिक बाइनरी धाराओं को डी-सेक करने के लिए हैं जो कई वस्तुओं से जुड़े हैं।

इसके लिए मेरा पसंदीदा टूल QPDF है , जो सभी प्रमुख OS प्लेटफार्मों पर उपलब्ध है। निम्न कमांड सभी स्ट्रीम और सभी ऑब्जेक्ट स्ट्रीम को कंप्रेस करता है:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

अब आप अपने पीडीएफ को किसी भी टेक्स्ट एडिटर में खोल सकते हैं। (वहां अभी भी कुछ बाइनरी ब्लब्स हो सकते हैं: उदाहरण के लिए, फ़ॉन्ट फाइलें और आईसीसी प्रोफाइल, जो कि QPDF के विस्तार के लिए कोई मतलब नहीं होगा)।

करने के लिए फिर से सेकexpanded.pdf फिर संपादन के बाद, आप चला सकते हैं:

 qpdf expanded.pdf orig2.pdf

(PDF को मैन्युअल रूप से संपादित करते समय सावधानीपूर्वक! आपको यह अधिकार करने के लिए उनके आंतरिक सिंटैक्स के बारे में बहुत कुछ जानना होगा। जैसे ही आप एक बाइट जोड़ते हैं या हटाते हैं, आप पीडीएफ पाठकों से त्रुटि संदेश प्राप्त कर सकते हैं जो अब सक्षम नहीं हो सकते हैं। इसे खोलें, क्योंकि PDFs आंतरिक TOC दूषित है, जो बाइट-ऑफसेट गणनाओं पर आधारित है। बस स्ट्रिंग Fitद्वारा प्रतिस्थापित XYZठीक जाना चाहिए, हालांकि ...)


1
आप टेक्स्ट को जोड़ या हटा भी सकते हैं। जब ऑब्जेक्ट स्ट्रीम की लंबाई बदलती है तो बाइट fix-qdfऑफ़सेट्स को उस प्रोग्राम का उपयोग करके पुन: प्रतिष्ठित किया जा सकता है जो qpdf का हिस्सा है। आपको अभी भी थोड़ा सावधान रहना होगा, हालांकि। देखें qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
एच Rittich

@ H.Rittich: Thx for the comment ... आपको किस तरह से लगता है कि यह समस्या पर एक नया दृष्टिकोण खोलती है? क्या आपको लगता है कि हम नहीं जानते कि हम इस तरह से टेक्स्ट को जोड़ या हटा सकते हैं?
कर्ट फ़िफ़ेल

@ कुर्सेफिफल: आप जो जानते हैं, उस पर मैं कोई धारणा नहीं बनाता। उत्तर में कहा गया है कि एक पीडीएफ को इस तरह से संपादित करने के लिए फ़ाइल में ऑब्जेक्ट्स के बाइट को संरक्षित करने की आवश्यकता होती है। हालाँकि, बाइट ऑफ़सेट्स को बदलना संभव है, जब बाद में उपयोग करके उन्हें सही किया जाता है fix-qdf। इसलिए, यदि आप एक स्ट्रिंग को अलग-अलग लंबाई के तार से बदलना चाहते हैं, तो यह संभव है, लेकिन आपको fix-qdfउपकरण का उपयोग करने की आवश्यकता है । मैं कहूंगा, कि यह उत्तर के लिए एक उपयोगी जोड़ है।
एच। रिटिच

@ एच.रिटिच: अपने परिप्रेक्ष्य देने के लिए Thx। जब मैंने वस्तुओं के बाइट्स को संरक्षित करने की आवश्यकता पर जोर दिया, तो मैं लोगों को HOW के बारे में सलाह नहीं देना चाहता था कि उन्हें ऐसा कैसे करना चाहिए। अगर आपने अपनी टिप्पणी को थोड़ा अलग तरीके से लिखा होता, तो मुझे आपकी टिप्पणी का इरादा तेजी से समझ में आता।
बजे कर्ट फ़िफ़ेल

1

sedलाइन-ओरिएंटेड है, जो बाइनरी फ़ाइलों के लिए अच्छी तरह से अनुकूल नहीं है, जो कि ब्लॉक नहीं लाइनों के रूप में संरचित हैं।
इसके बजाय bbe (bbe-.sourceforge.net) का उपयोग करने का प्रयास करें।

वैकल्पिक रूप से, दोनों Emacs (GNU और XEmacs) और पीडीएफ फाइलों को मूल रूप से खोलते हैं। यह बहुत सुंदर मुद्रित नहीं है, क्योंकि यह मिश्रित पाठ और द्विआधारी है, लेकिन यह आपके संपादन उद्देश्यों के लिए पर्याप्त है। Vim के लिए
एक Pdftk प्लगइन है जो सब कुछ आसान बनाता है, यहाँ डाउनलोड करें (ज़िप फ़ाइल)।
जैसा कि आप शायद जानते हैं, उपरोक्त दोनों संपादकों में शक्तिशाली खोज-और-क्षमताएँ हैं।

साथ ही, PDF फ़ाइलों को संपादित करने से पहले पीडीएफ को QDF मोड में परिवर्तित करना वास्तव में आसान है।


आप स्विच sedका उपयोग करके संपादित करने का भी प्रयास कर सकते हैं -b। अगर यह काम करता है तो मैं इसे अपने जवाब में जोड़ दूंगा।
फिलोमथ

@ टिम: आपका क्या मतलब है "कुछ भी नहीं दिखाता है", बस खाली है? कोई त्रुटि संदेश? इसके अलावा, आप XEmacs के साथ कोशिश कर सकते हैं? (उन तीनों ने मेरे लिए काम किया)।
फिलोमथ

-bइसके बारे में कोई बात नहीं , यह विशिष्ट है।
फिलोमथ

Emacs का कहना है कि "फ़ाइल 1.pdf बड़ा है (9MB), वास्तव में खुला है? (Y या n)"। मैंने "y" चुना, और फिर कुछ भी नहीं है।
टिम

सबसे शायद एक Emacs समस्या है, क्या आपके पास XEmacs है? (मैंने बिना किसी समस्या के सिर्फ 31 एमबी की पीडीएफ खोली)।
फिलोमैथ

0

पीडीएफ खोलने के लिए लिबरऑफिस या ओपनऑफिस का उपयोग करें, इसे देखें, चीजों को बदलें, एक नया पीडीएफ लिखें, आदि मुझे लगता है कि आप इसे कमांड लाइन से या प्रोग्रामेटिक रूप से भी उपयोग कर सकते हैं यदि प्रक्रिया के लिए बहुत सारे दस्तावेज़ हैं।

ध्यान दें कि कुछ स्रोतों, जैसे कि स्कैनर्स, से PDF अक्सर पृष्ठों को पाठ के बजाय छवियों के रूप में समाहित करता है ताकि आप खोज और प्रतिस्थापन का उपयोग करने के लिए उनके साथ भाग्य से बाहर हो जाएंगे।


3
(१/२) निम्नलिखित तथ्य से अवगत रहें: लिबर ऑफिस एक मूल पीडीएफ संपादक नहीं है। जब यह एक पीडीएफ खोलता है, तो यह सभी पृष्ठों को एक वेक्टर छवि में परिवर्तित कर देता है (जो मूल पीडीएफ से रेखापुंज भागों को रेखापुंज भागों के रूप में रख सकता है) और लिब्रे ऑफिस सूट के लिब्रे ऑफिस ड्रा भाग में इसे खोलता है । फिर, जब यह संपादित पीडीएफ फाइल को बचाता है, तो यह एक पीडीएफ फाइल होगी जिसे देशी लिब्रे ऑफिस ड्रा प्रारूप (प्रत्यय .odg के साथ ) से पीडीएफ में निर्यात किया गया था ।
कर्ट फ़िफ़ल

3
(2/2) इस वर्कफ़्लो में अप्रत्याशित दुष्प्रभाव हो सकते हैं। इसके अलावा, लिबर ऑफिस ड्रा एप्लिकेशन मूल पीडीएफ से सभी तत्वों को सही ढंग से आयात करने में सक्षम नहीं हो सकता है। हालांकि, कई मामलों में यह अभी भी उन सभी लोगों के लिए एक उपयोगी उपकरण हो सकता है जिनके पास कोई बेहतर साधन उपलब्ध नहीं है।
कर्ट फ़िफ़ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.