चूंकि अलग-अलग प्रकाशक "अंकन" के विभिन्न तरीकों का उपयोग करते हैं, इसलिए पीडीएफ को आपको यह सुनिश्चित करने की आवश्यकता होती है कि आप चिह्नों को ध्यान में रखे बिना तुलना करते हैं।
यदि आप बार-बार एक ही PDF डाउनलोड करते हैं और जैसा कि आप सुझाव देते हैं, यह IP और / या दिनांक-समय-स्टाम्प के साथ चिह्नित किया जाता है, तो आपको पहले से डाउनलोड किए गए PDF से एक नई PDF की तुलना करने के लिए एक कुशल विधि की भी आवश्यकता होती है। आप एक समय लेने वाली तुलना तंत्र का उपयोग नहीं करना चाहते हैं जो प्रत्येक नए पीडीएफ की तुलना कई पहले से डाउनलोड किए गए पीडीएफ से करता है
आपको जो आवश्यकता है वह एक उपयोगिता है जो प्रत्येक संभावित चिह्नों को स्ट्रिप करती है और शेष डेटा का एक हैश उत्पन्न करती है। आपको एक हैश → फ़ाइल नाम मानचित्र रखने की आवश्यकता होगी, जो एक साधारण फ़ाइल में हो सकता है, और यदि एक गणना हैश फ़ाइल में पहले से ही आपके पास एक डुप्लिकेट है (और इसे हटाएं या जो भी आवश्यक हो) और यदि हैश अभी तक नहीं है वहां, आप हैश और फ़ाइल का नाम जोड़ते हैं। फ़ाइल कुछ इस तरह दिखाई देगी:
6fcb6969835d2db7742e81267437c432 /home/anthon/Downloads/explanation.pdf
fa24fed8ca824976673a51803934d6b9 /home/anthon/orders/your_order_20150320.pdf
मूल PDF की तुलना में यह फ़ाइल लापरवाही से छोटी है। यदि आपके पास लाखों PDF हैं, तो आप इस डेटा को डेटाबेस में संग्रहीत करने पर विचार कर सकते हैं। दक्षता के लिए, आप वहां पृष्ठों की संख्या और फाइलों को शामिल करना चाह सकते हैं ( pdfinfo | egrep -E '^Pages:' | grep -Eo '[0-9]*'
)।
उपरोक्त चिह्नों को हटाने और हैश उत्पन्न करने के लिए समस्या को आगे बढ़ाता है। यदि आप जानते हैं कि पीडीएफ हैश जेनरेटिंग रूटीन को लागू करते समय कहां से आता है (यानी अगर आप प्रोग्राम को डाउनलोड करते हैं), तो आप उस के आधार पर हैश जेनरेशन को फाइन-ट्यून कर सकते हैं। लेकिन इसके बिना भी हैश जेनरेशन के लिए कई संभावनाएं हैं:
- यदि शीर्षक और लेखक के लिए मेटाडेटा गैर-रिक्त है और "एक्रोबैट" या "पीडीएफ" जैसे गैर-विशिष्ट स्ट्रिंग्स को शामिल नहीं करता है, तो आप बस लेखक और शीर्षक जानकारी के आधार पर हैश उत्पन्न कर सकते हैं।
pdfinfo -E file.pdf | grep -E '^(Author:)|(Title:) | md5sum
हैश पाने के लिए उपयोग करें । आप हैश की गणना के साथ-साथ ( आउटपुट Pages:
में ' ' pdfinfo
) पेजों की संख्या शामिल कर सकते हैं ।
- यदि पिछला नियम काम नहीं करता है और पीडीएफ में चित्र हैं, तो चित्र निकालें और संयुक्त छवि डेटा पर एक हैश उत्पन्न करें। यदि छवियों में कभी भी पाद लेख या हेडर में "लाइसेन्ड टू जो यूजर" जैसे पाठ होते हैं, तो हॅश की गणना करने से पहले, एक्स या बॉटम लाइन की पट्टी को ऊपर या नीचे बनाते हैं। यदि वह चिह्न कुछ बड़े अक्षर वाले ग्रे बैकग्राउंड टेक्स्ट में है, तो यह निश्चित रूप से काम नहीं करेगा, जब तक कि आप पिक्सेल को फ़िल्टर नहीं करते हैं जो पूरी तरह से काले नहीं हैं (इसके लिए आप उपयोग कर सकते हैं
imagemagick
)। आप pdfimages
एक अस्थायी फ़ाइल में छवि जानकारी निकालने के लिए उपयोग कर सकते हैं ।
- यदि पिछले नियम काम नहीं करते हैं (क्योंकि कोई चित्र नहीं हैं) तो आप
pdftext
टेक्स्ट को निकालने के लिए उपयोग कर सकते हैं , मार्किंग को फ़िल्टर कर सकते हैं (यदि आप थोड़ा बहुत फ़िल्टर करते हैं, तो यह कोई समस्या नहीं है) और फिर हैश के आधार पर जेनरेट करें उस।
इसके अतिरिक्त आप तुलना कर सकते हैं कि हैश के माध्यम से मिली पुरानी फ़ाइल का फ़ाइल आकार और देखें कि क्या नई फ़ाइल के साथ कुछ मार्जिन में है। स्ट्रिंग्स (आईपी / डेट-टाइम-स्टैम्प) में संपीड़न और ifferences केवल एक प्रतिशत से कम अंतर के परिणामस्वरूप होने चाहिए।
यदि आपको पता है कि हैश का निर्धारण करते समय प्रकाशक द्वारा उपयोग की जाने वाली विधि, तो आप सीधे ऊपर की "सही" विधि को लागू कर सकते हैं, लेकिन इसके बावजूद भी आप मेटाडेटा के लिए जाँच कर सकते हैं और कुछ उत्तराधिकार को लागू कर सकते हैं, या किसी फ़ाइल में छवियों की संख्या निर्धारित कर सकते हैं। और तुलना करें कि पृष्ठों की संख्या के साथ (यदि वे पास हैं तो आपके पास संभवतः स्कैन से युक्त दस्तावेज़ है)। pdftext
स्कैन की गई छवि पीडीएफ में भी एक पहचानने योग्य आउटपुट होता है।
मैं से काम करने के लिए एक आधार के रूप में एक अजगर पैकेज पर है कि बनाया bitbucket और / या से स्थापित किया जा सकता PyPI का उपयोग कर pip install ruamel.pdfdouble
। यह आपको उस pdfdbl
कमांड के साथ प्रदान करता है जो मेटाडेटा, निकाली गई छवियों या पाठ पर ऊपर वर्णित अनुसार स्कैनिंग करता है।
यह चिह्नों (अभी तक) के किसी भी फ़िल्टरिंग को नहीं करता है , लेकिन रीडमी यह वर्णन करता है कि किन (दो) तरीकों को बढ़ाने के लिए इसे जोड़ना है।
शामिल रीडमी:
ruamel.pdfdouble
यह पैकेज pdfdbl
कमांड प्रदान करता है :
pdfdbl scan dir1 dir2
यह तर्क के रूप में प्रदान की गई निर्देशिकाओं और नीचे दी गई पीडीएफ फाइलों के लिए चलेगा, (क्रम में) के आधार पर एक हैश बनाएं:
- मेटाडाटा यदि अद्वितीय है
- छवियों अगर छवियों की संख्या
- टेक्स्ट
यह मानता है कि poppler-utils पैकेज से pdfinfo, pdfimages और pdftotext` avaialable हैं।
एक "डेटाबेस" का निर्माण किया जाता है, ~/.config/pdfdbl/pdf.lst
जिसके खिलाफ आगे के स्कैन का परीक्षण किया जाता है।
चिह्नों को हटाना
में ruamel/pdfdouble/pdfdouble.py
वहाँ दो तरीकों कि पीडीएफ है कि उन्हें कम अद्वितीय बनाने के लिए और अलग अलग हैश के लिए लगभग एक ही फाइल को बनाने में चिह्नों को फिल्टर करने बढ़ाया जा सकता है कर रहे हैं।
पाठ के लिए विधि PdfData.filter_for_marking
को स्ट्रिंग से निकालने और चिह्नित करने के लिए बढ़ाया जाना चाहिए जो कि इसके तर्क हैं और परिणाम लौटाते हैं।
स्कैन की गई छवियों के लिए विधि को बढ़ाने की PdfData.process_image_and_update
आवश्यकता होती है, उदाहरण के लिए छवियों को नीचे और ऊपर की एक्स लाइनों को काटकर, और सभी काले पिक्सेल को सफेद में सेट करके किसी भी ग्रे बैकग्राउंड टेक्स्ट को हटा दिया जाता है। इस फ़ंक्शन .update()
को फ़िल्टर किए गए डेटा में पास करने की विधि का उपयोग करके पास किए गए हैश को अपडेट करना होगा ।
प्रतिबंध
वर्तमान "डेटाबेस" उन रास्तों को संभाल नहीं सकता है जिनमें न्यूलाइन्स शामिल हैं
यह उपयोगिता वर्तमान में केवल पायथन 2.7 है।
आईपी अनुरूप स्ट्रिंगरों को पायथन के re
मॉड्यूल के साथ प्रतिस्थापित किया जा सकता है :
import re
IPre = re.compile("(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}"
"([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])")
x = IPre.sub(' ', 'abcd 132.234.0.2 ghi')
assert x == 'abcd ghi'