एक एन्क्रिप्टेड पीडीएफ से अजगर डेटा निष्कर्षण


12

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

सबसे पहले, मैंने कुछ पायथन पुस्तकालयों के साथ पीडीएफ पढ़ने की कोशिश की। हालाँकि, पायथन पुस्तकालय जो मुझे मिला वह एन्क्रिप्टेड पीडीएफ नहीं पढ़ता है। उस समय, मैं Adobe Reader का उपयोग करके जानकारी को निर्यात नहीं कर सका।

दूसरा, मैंने पीडीएफ को डिक्रिप्ट करने का फैसला किया। मैं पायथन लाइब्रेरी pykepdf का उपयोग करने में सफल रहा। Pykepdf बहुत अच्छा काम करता है! हालांकि, decrypted पीडीएफ़ अच्छी तरह से पिछले बिंदु (के पायथन पुस्तकालयों के साथ के रूप में पढ़ा नहीं जा सकता PyPDF2 और Tabula )। इस समय, हमने कुछ सुधार किया है क्योंकि Adobe Reader का उपयोग करके मैं डिक्रिप्टेड PDF से जानकारी निर्यात कर सकता हूं, लेकिन लक्ष्य सब कुछ पायथन के साथ करना है।

कोड जो मैं दिखा रहा हूं वह पूरी तरह से अनएन्क्रिप्टेड पीडीएफ के साथ काम करता है, लेकिन एन्क्रिप्टेड पीडीएफ के साथ नहीं। यह डिक्रिप्टेड PDF के साथ काम नहीं कर रहा है जो pykepdf के साथ भी प्राप्त किए गए थे।

मैंने कोड नहीं लिखा था। मैं पायथन पुस्तकालयों के दस्तावेज में यह पाया Pykepdf और Tabula । PyPDF2 समाधान को अल स्वेगार्ट ने अपनी पुस्तक, " ऑटोमेटिक द बोरिंग स्टफ इन पाइथन ," के साथ लिखा था कि मैं अत्यधिक अनुशंसा करता हूं। मैंने यह भी जांचा कि कोड ठीक काम कर रहा है या नहीं, जो मैंने पहले समझाया था।

पहला सवाल, मैं डिक्रिप्टेड फ़ाइलों को क्यों नहीं पढ़ सकता, अगर प्रोग्राम उन फाइलों के साथ काम करते हैं जिन्हें कभी एन्क्रिप्ट नहीं किया गया है?

दूसरा सवाल, क्या हम पायथन की डिक्रिप्टेड फाइलों को किसी तरह पढ़ सकते हैं? कौन सा पुस्तकालय यह कर सकता है या असंभव है? क्या सभी डिक्रिप्ट किए गए पीडीएफ निकालने योग्य हैं?

आपके समय और मदद के लिए धन्यवाद!!!

मैंने पायथन 3.7, विंडोज 10, ज्यूपिटर नोटबुक और एनाकोंडा 2019.07 का उपयोग करके ये परिणाम पाए।

Python

import pikepdf
with pikepdf.open("encrypted.pdf") as pdf:
  num_pages = len(pdf.pages)
  del pdf.pages[-1]
  pdf.save("decrypted.pdf")

import tabula
tabula.read_pdf("decrypted.pdf", stream=True)

import PyPDF2
pdfFileObj=open("decrypted.pdf", "rb")
pdfReader=PyPDF2.PdfFileReader(pdfFileObj)
pdfReader.numPages
pageObj=pdfReader.getPage(0)
pageObj.extractText()

तबुला के साथ, मुझे संदेश मिल रहा है "आउटपुट फ़ाइल खाली है।"

PyPDF2 के साथ, मुझे केवल '/ n' मिल रहा है

अद्यतन 10/3/2019 Pdfminer.six (संस्करण नवंबर 2018)

डकपंचर द्वारा पोस्ट किए गए समाधान का उपयोग करके मुझे बेहतर परिणाम मिले । डिक्रिप्ट की गई फ़ाइल के लिए, मुझे लेबल मिला, लेकिन डेटा नहीं। एन्क्रिप्टेड फ़ाइल के साथ भी ऐसा ही होता है। उस फ़ाइल के लिए जिसे कभी एन्क्रिप्ट नहीं किया गया है, एकदम सही काम करती है। जैसा कि मुझे एन्क्रिप्टेड या डिक्रिप्टेड फ़ाइलों के डेटा और लेबल की आवश्यकता है, यह कोड मेरे लिए काम नहीं करता है। उस विश्लेषण के लिए, मैंने pdfminer.six का उपयोग किया जो कि पायथन लाइब्रेरी है जिसे नवंबर 2018 में जारी किया गया था। Pdfminer.six में एक पुस्तकालय pycryptodome शामिल है। उनके दस्तावेज के अनुसार " PyCryptodome निम्न-स्तरीय क्रिप्टोग्राफ़िक प्राथमिकताओं का एक स्व-निहित अजगर पैकेज है .."

कोड स्टैक एक्सचेंज प्रश्न में है: अजगर में PDFMiner का उपयोग करके एक पीडीएफ फाइल से टेक्स्ट को निकालना?

यदि आप मेरे प्रयोग को दोहराना चाहते हैं तो मुझे अच्छा लगेगा। यहाँ वर्णन है:

1) इस प्रश्न में वर्णित कोड को किसी भी पीडीएफ के साथ चलाएं जिसे कभी भी एन्क्रिप्ट नहीं किया गया है।

2) पीडीएफ "सिक्योर" के साथ भी ऐसा ही करें (यह एक शब्द है जिसे एडोब उपयोग करता है), मैं इसे एन्क्रिप्टेड पीडीएफ कह रहा हूं। एक सामान्य रूप का उपयोग करें जिसे आप Google का उपयोग करके पा सकते हैं। इसे डाउनलोड करने के बाद, आपको फ़ील्ड भरने की आवश्यकता है। अन्यथा, आप लेबल के लिए जाँच कर रहे होंगे, लेकिन फ़ील्ड नहीं। डेटा खेतों में है।

3) Pykepdf का उपयोग कर एन्क्रिप्टेड पीडीएफ को डिक्रिप्ट करें। यह डिक्रिप्टेड पीडीएफ होगा।

4) डिक्रिप्टेड पीडीएफ का उपयोग करके फिर से कोड चलाएं।

अद्यतन 10/4/2019 कैमलॉट (संस्करण जुलाई 2019)

मुझे पायथन लाइब्रेरी कैमलॉट मिला। सावधान रहें कि आपको कैमलोट-पी की आवश्यकता है 0.7.3।

यह बहुत शक्तिशाली है, और पायथन 3.7 के साथ काम करता है। इसके अलावा, इसका उपयोग करना बहुत आसान है। सबसे पहले, आपको घोस्टस्क्रिप्ट को स्थापित करने की भी आवश्यकता है । अन्यथा, यह काम नहीं करेगा। आपको पंडों को स्थापित करने की भी आवश्यकता है । पाइप इंस्टॉल कैमलोट-पी का उपयोग न करें । इसके बजाय पाइप इंस्टॉल कैमलॉट-पी [सीवी] का उपयोग करें

कार्यक्रम के लेखक विनायक मेहता हैं। फ्रैंक डू इस कोड को एक यूट्यूब वीडियो में साझा करता है "अजगर से पीडीएफ के साथ सारणीबद्ध डेटा निकालें" पायथन का उपयोग करते हुए।

मैंने कोड की जाँच की और यह अनएन्क्रिप्टेड फ़ाइलों के साथ काम कर रहा है। हालाँकि, यह एन्क्रिप्टेड और डिक्रिप्टेड फ़ाइलों के साथ काम नहीं करता है, और यही मेरा लक्ष्य है

कैमलॉट पीडीएफ से टेबल प्राप्त करने के लिए उन्मुख है।

यहाँ कोड है:

Python

import camelot
import pandas
name_table = camelot.read_pdf("uncrypted.pdf")
type(name_table)

#This is a Pandas dataframe
name_table[0]

first_table = name_table[0]   

#Translate camelot table object to a pandas dataframe
first_table.df

first_table.to_excel("unencrypted.xlsx")
#This creates an excel file.
#Same can be done with csv, json, html, or sqlite.

#To get all the tables of the pdf you need to use this code.
for table in name_table:
   print(table.df)

अद्यतन 10/7/2019 मुझे एक चाल मिली। यदि मैं एडोब रीडर के साथ सुरक्षित पीडीएफ खोलता हूं, और मैं इसे माइक्रोसॉफ्ट से पीडीएफ का उपयोग करके प्रिंट करता हूं, और मैं इसे पीडीएफ के रूप में सहेजता हूं, तो मैं उस कॉपी का उपयोग करके डेटा निकाल सकता हूं। मैं पीडीएफ फाइल को JSON, एक्सेल, SQLite, CSV, HTML और अन्य प्रारूपों में भी बदल सकता हूं। यह मेरे प्रश्न का एक संभावित समाधान है। हालाँकि, मैं अभी भी इसे बिना किसी चाल के करने के लिए एक विकल्प की तलाश कर रहा हूं क्योंकि लक्ष्य इसे पायथन के साथ 100% करना है। मुझे इस बात का भी मलाल है कि अगर एन्क्रिप्शन का बेहतर तरीका इस्तेमाल किया जाए तो शायद काम नहीं चलेगा। कभी-कभी आपको निकालने योग्य प्रतिलिपि प्राप्त करने के लिए कई बार एडोब रीडर का उपयोग करने की आवश्यकता होती है।

UPDATE 10/8/2019। तीसरा सवाल। मेरा अब तीसरा सवाल है। क्या सभी सुरक्षित / एन्क्रिप्टेड पीडीएफ पासवर्ड संरक्षित हैं? क्यों pikepdf काम नहीं कर रहा है? मेरा अनुमान है कि pikepdf का वर्तमान संस्करण कुछ प्रकार के एनक्रिप्ट को तोड़ सकता है, लेकिन उन सभी को नहीं। @constt ने उल्लेख किया कि PyPDF2 किसी प्रकार की सुरक्षा को तोड़ सकता है। हालांकि, मैंने उसे जवाब दिया कि मुझे एक लेख मिला है कि PyPDF2 एडोब एक्रोबैट प्रो 6.0 के साथ किए गए एन्क्रिप्ट को तोड़ सकता है, लेकिन पीछे के संस्करणों के साथ नहीं।


2
मैं इन मुद्दों को पुन: पेश नहीं कर सका PyPDF2, सब कुछ ठीक काम करता है। मैंने pdftkफ़ाइलों को एन्क्रिप्ट करने के लिए ऑनलाइन सेवाओं का भी उपयोग किया । क्या आप "परेशानी" पीडीएफ फाइलों के लिंक पोस्ट कर सकते हैं?
constt

1
ठीक है धन्यवाद! क्या आपने qpdfअपनी फ़ाइलों को डिक्रिप्ट करने के लिए उपयोग करने की कोशिश की है ? इस मामले में यह चाल चलेगा, आप इसे अपने स्क्रिप्ट से subprocessमॉड्यूल का उपयोग करके फ़ाइलों को पार्स करने से पहले डिक्रिप्ट कर सकते हैं।
अष्टक

1
सबसे पहले, PyPDF2 एक्रोबेट पीडीएफ फाइलों को डिक्रिप्ट नहीं कर सकता है => 6.0। दूसरा, pikepdf में वर्तमान में पाठ निष्कर्षण कार्यान्वयन नहीं है।
जीवन जटिल

1
@Beginner मुझे लगता है कि यह अंतर्निहित स्वरूपण के साथ करना होगा pykepdf द्वारा unencrypted PDF लिखने के लिए किया जा रहा है।
जीवन जटिल है

2
"क्या सभी सुरक्षित / एन्क्रिप्टेड पीडीएफ पासवर्ड संरक्षित हैं?" - नहीं। X509 प्रमाणपत्रों के आधार पर निजी / सार्वजनिक कुंजी क्रिप्टोग्राफी का उपयोग करते हुए एन्क्रिप्टेड pdfs भी हैं।
mkl

जवाबों:


8

पिछले अद्यतन 10-11-2019

अगर मैं आपके सवाल को पूरी तरह से समझ पा रहा हूं तो मैं अनिश्चित हूं। नीचे दिए गए कोड को परिष्कृत किया जा सकता है, लेकिन यह एक एन्क्रिप्टेड या अनएन्क्रिप्टेड पीडीएफ में पढ़ता है और पाठ को निकालता है। कृपया मुझे बताएं कि क्या मैंने आपकी आवश्यकताओं को गलत समझा।

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def extract_encrypted_pdf_text(path, encryption_true, decryption_password):

  output = StringIO()

  resource_manager = PDFResourceManager()
  laparams = LAParams()

  device = TextConverter(resource_manager, output, codec='utf-8', laparams=laparams)

  pdf_infile = open(path, 'rb')
  interpreter = PDFPageInterpreter(resource_manager, device)

  page_numbers = set()

  if encryption_true == False:
    for page in PDFPage.get_pages(pdf_infile, page_numbers, maxpages=0, caching=True, check_extractable=True):
      interpreter.process_page(page)

  elif encryption_true == True:
    for page in PDFPage.get_pages(pdf_infile, page_numbers, maxpages=0, password=decryption_password, caching=True, check_extractable=True):
      interpreter.process_page(page)

 text = output.getvalue()
 pdf_infile.close()
 device.close()
 output.close()
return text

results = extract_encrypted_pdf_text('encrypted.pdf', True, 'password')
print (results)

मैंने नोट किया कि आपका pikepdf एन्क्रिप्टेड पीडीएफ को खोलने के लिए इस्तेमाल किया गया कोड एक पासवर्ड याद कर रहा था, जिसे इस त्रुटि संदेश को फेंक देना चाहिए:

pikepdf._qpdf.PasswordError: एन्क्रिप्ट किया गया। पीडीएफ: अमान्य पासवर्ड

import pikepdf

with pikepdf.open("encrypted.pdf", password='password') as pdf:
num_pages = len(pdf.pages)
del pdf.pages[-1]
pdf.save("decrypted.pdf")

आप उपयोग कर सकते हैं टीका द्वारा बनाई decrypted.pdf से पाठ निकालने के लिए pikepdf

from tika import parser

parsedPDF = parser.from_file("decrypted.pdf")
pdf = parsedPDF["content"]
pdf = pdf.replace('\n\n', '\n')

इसके अतिरिक्त, pikepdf वर्तमान में पाठ निष्कर्षण को लागू नहीं करता है जिसमें नवीनतम रिलीज़ v1.6.4 शामिल है।


मैंने विभिन्न एन्क्रिप्टेड पीडीएफ फाइलों का उपयोग करके कुछ परीक्षण चलाने का फैसला किया।

मैंने सभी एन्क्रिप्टेड फाइलों को 'एन्क्रिप्टेड.पीएफडी' नाम दिया है और वे सभी एक ही एन्क्रिप्शन और डिक्रिप्शन पासवर्ड का उपयोग करते हैं।

  1. एडोब एक्रोबेट 9.0 और बाद में - एन्क्रिप्शन स्तर 256-बिट एईएस

    • pikepdf इस फाइल को डिक्रिप्ट करने में सक्षम था
    • PyPDF2 पाठ को सही ढंग से नहीं निकाल सका
    • tika टेक्स्ट को सही तरीके से निकाल सकता है
  2. Adobe Acrobat 6.0 और बाद में - एन्क्रिप्शन स्तर 128-बिट RC4

    • pikepdf इस फाइल को डिक्रिप्ट करने में सक्षम था
    • PyPDF2 पाठ को सही ढंग से नहीं निकाल सका
    • tika टेक्स्ट को सही तरीके से निकाल सकता है
  3. एडोब एक्रोबैट 3.0 और बाद में - एन्क्रिप्शन स्तर 40-बिट आरसी 4

    • pikepdf इस फाइल को डिक्रिप्ट करने में सक्षम था
    • PyPDF2 पाठ को सही ढंग से नहीं निकाल सका
    • tika टेक्स्ट को सही तरीके से निकाल सकता है
  4. एडोब एक्रोबैट 5.0 और बाद में - एन्क्रिप्शन स्तर 128-बिट आरसी 4

    • Microsoft Word के साथ बनाया गया
    • pikepdf इस फाइल को डिक्रिप्ट करने में सक्षम था
    • PyPDF2 टेक्स्ट को सही तरीके से निकाल सकता है
    • tika टेक्स्ट को सही तरीके से निकाल सकता है
  5. एडोब एक्रोबेट 9.0 और बाद में - एन्क्रिप्शन स्तर 256-बिट एईएस

    • pdfprotectfree का उपयोग करके बनाया गया
    • pikepdf इस फाइल को डिक्रिप्ट करने में सक्षम था
    • PyPDF2 टेक्स्ट को सही तरीके से निकाल सकता है
    • tika टेक्स्ट को सही तरीके से निकाल सकता है

PyPDF2 एडोब एक्रोबेट के साथ नहीं बनाई गई डिक्रिप्टेड पीडीएफ फाइलों से पाठ निकालने में सक्षम था।

मुझे लगता है कि असफलताओं का Adobe Acrobat द्वारा बनाई गई PDF में एम्बेडेड स्वरूपण के साथ कुछ करना है। स्वरूपण के बारे में इस अनुमान की पुष्टि करने के लिए अधिक परीक्षण की आवश्यकता है।

tika pikepdf के साथ डिक्रिप्ट किए गए सभी दस्तावेज़ों से टेक्स्ट निकालने में सक्षम था।


 import pikepdf
 with pikepdf.open("encrypted.pdf", password='password') as pdf:
    num_pages = len(pdf.pages)
    del pdf.pages[-1]
    pdf.save("decrypted.pdf")


 from PyPDF2 import PdfFileReader

 def text_extractor(path):
   with open(path, 'rb') as f:
     pdf = PdfFileReader(f)
     page = pdf.getPage(1)
     print('Page type: {}'.format(str(type(page))))
     text = page.extractText()
     print(text)

    text_extractor('decrypted.pdf')

PyPDF2 एक्रोबैट पीडीएफ फाइलों को डीक्रिप्ट नहीं कर सकता है => 6.0

यह मुद्दा 15 सितंबर, 2015 से मॉड्यूल मालिकों के साथ खुला है । इस समस्या से संबंधित टिप्पणियों में यह स्पष्ट नहीं है कि यह समस्या परियोजना मालिकों द्वारा कब तय की जाएगी। 25 जून, 2018 को अंतिम प्रतिबद्धता थी।

PyPDF4 डिक्रिप्शन समस्याएँ

PyPDF4 PyPDF2 के लिए प्रतिस्थापन है। इस मॉड्यूल में पीडीएफ फाइलों को एन्क्रिप्ट करने के लिए उपयोग किए जाने वाले कुछ एल्गोरिदम के साथ डिक्रिप्शन समस्याएं भी हैं।

परीक्षण फ़ाइल: एडोब एक्रोबेट 9.0 और बाद में - एन्क्रिप्शन स्तर 256-बिट एईएस

PyPDF2 त्रुटि संदेश: केवल एल्गोरिथ्म कोड 1 और 2 समर्थित हैं

PyPDF4 त्रुटि संदेश: केवल एल्गोरिथ्म कोड 1 और 2 समर्थित हैं। यह पीडीएफ 5 कोड का उपयोग करता है


अद्यतन अनुभाग 10-11-2019

यह खंड 10-07-2019 और 10-08-2019 को आपके अपडेट के जवाब में है।

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

एडोब पीडीएफ सुरक्षा का स्तर

Adobe PDF में कई प्रकार के सुरक्षा नियंत्रण होते हैं जिन्हें दस्तावेज़ के स्वामी द्वारा सक्षम किया जा सकता है। नियंत्रणों को एक पासवर्ड या एक प्रमाण पत्र के साथ लागू किया जा सकता है।

  1. दस्तावेज़ एन्क्रिप्शन (एक दस्तावेज़ खुले पासवर्ड के साथ लागू)

    • सभी दस्तावेज़ सामग्री एन्क्रिप्ट करें (सबसे आम)
    • मेटाडेटा => एक्रोबैट 6.0 को छोड़कर सभी दस्तावेज़ सामग्री को एन्क्रिप्ट करें
    • केवल फ़ाइल अनुलग्नक एन्क्रिप्ट करें => एक्रोबैट 7.0
  2. प्रतिबंधात्मक संपादन और मुद्रण (अनुमत पासवर्ड के साथ लागू)

    • मुद्रण अनुमति है
    • परिवर्तन की अनुमति है

नीचे दी गई छवि में Adobe PDF को 256-बिट एईएस एन्क्रिप्शन के साथ एन्क्रिप्ट किया गया है। इस पीडीएफ को खोलने या प्रिंट करने के लिए एक पासवर्ड की आवश्यकता होती है। जब आप पासवर्ड के साथ एडोब रीडर में इस दस्तावेज़ को खोलते हैं, तो शीर्षक SECURED होगा

password_level_encryption

इस दस्तावेज़ को पायथन मॉड्यूल के साथ खोलने के लिए एक पासवर्ड की आवश्यकता होती है जो इस उत्तर में उल्लिखित है। यदि आप Adobe Reader के साथ एन्क्रिप्टेड पीडीएफ खोलने का प्रयास करते हैं। आपको यह देखना चाहिए:

password_prompt

यदि आपको यह चेतावनी नहीं मिलती है, तो दस्तावेज़ में या तो कोई सुरक्षा नियंत्रण सक्षम नहीं है या केवल प्रतिबंधात्मक संपादन और मुद्रण सक्षम हैं।

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

जब आप इस दस्तावेज़ को एक नए पीडीएफ में प्रिंट करते हैं तो SECURED चेतावनी हटा दी जाती है, क्योंकि प्रतिबंधात्मक संपादन हटा दिया गया है।

password_level_restrictive_editing

सभी Adobe उत्पाद अनुमतियों के पासवर्ड द्वारा निर्धारित प्रतिबंधों को लागू करते हैं। हालाँकि, यदि तृतीय-पक्ष उत्पाद इन सेटिंग्स का समर्थन नहीं करते हैं, तो दस्तावेज़ प्राप्तकर्ता कुछ या सभी प्रतिबंधों को बायपास करने में सक्षम हैं

इसलिए मैं मानता हूं कि आप जिस दस्तावेज़ को पीडीएफ में प्रिंट कर रहे हैं उसमें प्रतिबंधात्मक संपादन सक्षम है और उसके पास सक्षम खोलने के लिए आवश्यक पासवर्ड नहीं है।

पीडीएफ एन्क्रिप्शन को तोड़ने के बारे में

न तो PyPDF2 या PyPDF4 एक PDF दस्तावेज़ के दस्तावेज़ खुले पासवर्ड फ़ंक्शन को तोड़ने के लिए डिज़ाइन किए गए हैं। यदि वे एक एन्क्रिप्टेड पासवर्ड संरक्षित पीडीएफ फाइल खोलने का प्रयास करते हैं, तो दोनों मॉड्यूल निम्नलिखित त्रुटि को फेंक देंगे।

PyPDF2.utils.PdfReadError: फ़ाइल को डिक्रिप्ट नहीं किया गया है

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

पीडीएफ एन्क्रिप्शन आंतरिक रूप से पीडीएफ संस्करण के आधार पर 40, 128 या 256 बिट के एन्क्रिप्शन कुंजी के साथ काम करता है। बाइनरी एन्क्रिप्शन कुंजी उपयोगकर्ता द्वारा प्रदान किए गए पासवर्ड से ली गई है। पासवर्ड लंबाई और एन्कोडिंग बाधाओं के अधीन है।

उदाहरण के लिए, पीडीएफ 1.7 एडोब एक्सटेंशन लेवल 3 (एक्रोबैट 9 - एईएस -256) ने यूनिकोड वर्ण (65,536 संभावित वर्ण) पेश किए और पासवर्ड की UTF-8 प्रतिनिधित्व में 127 बाइट की अधिकतम लंबाई टकरा गई।


नीचे दिए गए कोड से एक पीडीएफ खुल जाएगा जिसमें प्रतिबंधात्मक संपादन सक्षम होगा। यह फ़ाइल को एक नई PDF में सुरक्षित चेतावनी के बिना सहेजा जाएगा। टीका कोड नई फ़ाइल से सामग्रियों को पार्स होगा।

from tika import parser
import pikepdf

# opens a PDF with restrictive editing enabled, but that still 
# allows printing.
with pikepdf.open("restrictive_editing_enabled.pdf") as pdf:
  pdf.save("restrictive_editing_removed.pdf")

  # plain text output
  parsedPDF = parser.from_file("restrictive_editing_removed.pdf")

  # XHTML output
  # parsedPDF = parser.from_file("restrictive_editing_removed.pdf", xmlContent=True)

  pdf = parsedPDF["content"]
  pdf = pdf.replace('\n\n', '\n')
  print (pdf)

यदि फ़ाइल खोलने के लिए पासवर्ड आवश्यक है, तो यह कोड जांचता है। इस कोड को परिष्कृत किया जा सकता है और अन्य कार्यों को जोड़ा जा सकता है। कई अन्य विशेषताएं हैं जिन्हें जोड़ा जा सकता है, लेकिन pikepdf के लिए प्रलेखन कोड आधार के भीतर टिप्पणियों से मेल नहीं खाता है, इसलिए इसे सुधारने के लिए अधिक शोध की आवश्यकता है।

# this would be removed once logging is used
############################################
import sys
sys.tracebacklimit = 0
############################################

import pikepdf
from tika import parser

def create_pdf_copy(pdf_file_name):
  with pikepdf.open(pdf_file_name) as pdf:
    new_filename = f'copy_{pdf_file_name}'
    pdf.save(new_filename)
    return  new_filename

def extract_pdf_content(pdf_file_name):
  # plain text output
  # parsedPDF = parser.from_file("restrictive_editing_removed.pdf")

  # XHTML output
  parsedPDF = parser.from_file(pdf_file_name, xmlContent=True)

  pdf = parsedPDF["content"]
  pdf = pdf.replace('\n\n', '\n')
  return pdf

def password_required(pdf_file_name):
  try:
    pikepdf.open(pdf_file_name)

  except pikepdf.PasswordError as error:
    return ('password required')

  except pikepdf.PdfError as results:
    return ('cannot open file')


filename = 'decrypted.pdf'
password = password_required(filename)
if password != None:
  print (password)
elif password == None:
  pdf_file = create_pdf_copy(filename)
  results = extract_pdf_content(pdf_file)
  print (results)

2
आप पासवर्ड प्रदान किए बिना सुरक्षित पीडीएफ फाइल कैसे खोल रहे हैं?
जीवन जटिल है

1
क्या आप केवल प्रतिबंधात्मक संपादन सुरक्षा की बात कर रहे हैं?
जीवन जटिल है

1
एक पीडीएफ के साथ काम करने वाले कोड के साथ अद्यतन उत्तर, जिसमें प्रतिबंधात्मक संपादन सुरक्षा सक्षम थी, लेकिन मुद्रण की अनुमति थी।
जीवन

1
क्या आप XHTML का उपयोग कर सकते हैं?
जीवन

1
मैंने XHTML आउटपुट का उत्तर संशोधित किया। JSON संभव है, लेकिन इसके लिए gikaub प्रोजेक्ट कोड में tika parser से संबंधित खुदाई की आवश्यकता है।
जीवन जटिल है

1

जब आप इन फ़ाइलों को पासवर्ड के बिना खोलते हैं, तो आप इन फ़ाइलों को उत्पन्न करने की कोशिश कर सकते हैं।

import pikepdf

def open_pdf(pdf_file_path, pdf_password=''):
    try:
        pdf_obj = pikepdf.Pdf.open(pdf_file_path)

    except pikepdf._qpdf.PasswordError:
        pdf_obj = pikepdf.Pdf.open(pdf_file_path, password=pdf_password)

    finally:
        return pdf_obj

आप अपने पार्सिंग कार्य के लिए दिए गए pdf_obj का उपयोग कर सकते हैं। इसके अलावा, यदि आप एक एन्क्रिप्टेड पीडीएफ है, तो आप पासवर्ड प्रदान कर सकते हैं।


1
आपके उत्तर के लिए धन्यवाद! हम इसे पासवर्ड के बिना पढ़ने की कोशिश कर रहे हैं। इस समय, हम इसे उस विधि के साथ करने में सक्षम थे जो मेरे UPDATE
शुरुआत

यह सवाल का जवाब देने से बहुत दूर है। लगता है जैसे आपने पूरा प्रश्न नहीं पढ़ा है।
शोयना ek

1
यह उन सुरक्षित पीडीएफ को संभालता है जहां आम तौर पर pikepdf विफल रहता है जब पासवर्ड का डिफ़ॉल्ट मान कोई नहीं होता है। एक खाली स्ट्रिंग को पास करने से यह एक सुरक्षित पीडीएफ दस्तावेज़ को ठीक से खोलने और पार्स करने में सक्षम है (परीक्षण के मामलों में जो मैं भाग गया था)।
महेंद्र सिंह

1
@Beginner u को इस मामले में यहाँ पीडीएफ कन्वर्ट करने की आवश्यकता नहीं है। यह सिर्फ मेरे पूर्व अनुभव से है जो खाली पासवर्ड प्रदान करके PDF को सुरक्षित करता है।
महेंद्र सिंह

1
@Beginner यह मेरा पूरा कोड है। यह केवल pikepdf से pdf_object देता है। यदि आप इस pdf को सहेजना चाहते हैं, तो बस दिए गए ऑब्जेक्ट को pdf_obj.save ('your_file_path') का उपयोग करके सहेजें। इसके बाद, आप इस पीडीएफ का उपयोग पाठ और अन्य वस्तुओं को पार्स करने के लिए कर सकते हैं। मैं पाठ निष्कर्षण के लिए PdfPlumber नामक पुस्तकालय का उपयोग करता हूं ।
महेंद्र सिंह

1

तबला-पी के लिए, आप read_pdf के साथ पासवर्ड विकल्प आज़मा सकते हैं। यह तबला-जावा के कार्य पर निर्भर करता है इसलिए मुझे यकीन नहीं है कि कौन सा एन्क्रिप्शन हालांकि समर्थित है।

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