Python การสกัดข้อมูลจาก PDF ที่เข้ารหัส


12

ฉันเพิ่งสำเร็จการศึกษาด้านคณิตศาสตร์บริสุทธิ์ซึ่งมีหลักสูตรการเขียนโปรแกรมขั้นพื้นฐานเพียงไม่กี่หลักสูตรเท่านั้น ฉันกำลังฝึกงานและฉันมีโครงการวิเคราะห์ข้อมูลภายใน ฉันต้องวิเคราะห์ PDF ภายในของปีที่ผ่านมา PDF นั้น "ปลอดภัย" กล่าวอีกนัยหนึ่งมันถูกเข้ารหัส เราไม่มีรหัสผ่าน PDF ยิ่งกว่านั้นเราไม่แน่ใจว่ามีรหัสผ่านหรือไม่ แต่เรามีเอกสารเหล่านี้ทั้งหมดและเราสามารถอ่านได้ด้วยตนเอง เราสามารถพิมพ์ได้เช่นกัน เป้าหมายคือการอ่านด้วย Python เพราะเป็นภาษาที่เรามีความคิด

ก่อนอื่นฉันพยายามอ่าน PDF ด้วยห้องสมุด Python อย่างไรก็ตามไลบรารี Python ที่ฉันพบไม่อ่าน PDF ที่เข้ารหัส ในเวลานั้นฉันไม่สามารถส่งออกข้อมูลโดยใช้ Adobe Reader ได้เช่นกัน

ประการที่สองฉันตัดสินใจถอดรหัส PDF ฉันประสบความสำเร็จในการใช้ Python library pykepdf Pykepdfทำงานได้ดีมาก! อย่างไรก็ตามไฟล์ PDF ที่ถอดรหัสแล้วนั้นไม่สามารถอ่านได้เช่นกันกับห้องสมุด Python ของจุดก่อนหน้า ( PyPDF2และTabula ) ในเวลานี้เราได้ทำการปรับปรุงบางอย่างเพราะการใช้ Adobe Reader ฉันสามารถส่งออกข้อมูลจากไฟล์ PDF ที่ถอดรหัส แต่เป้าหมายคือการทำทุกอย่างด้วย Python

รหัสที่ฉันแสดงนั้นทำงานได้อย่างสมบูรณ์กับ PDF ที่ไม่ได้เข้ารหัส แต่ไม่ใช่กับ PDF ที่เข้ารหัส มันไม่ทำงานกับไฟล์ PDF ที่ถอดรหัสซึ่งได้รับด้วย pykepdf เช่นกัน

ฉันไม่ได้เขียนรหัส ผมพบว่ามันอยู่ในเอกสารของงูหลามห้องสมุดPykepdfและกระดาน โซลูชัน PyPDF2 เขียนโดยAl Sweigartในหนังสือของเขา " Automate the Boring Stuff with Python " ซึ่งฉันขอแนะนำอย่างยิ่ง ฉันยังตรวจสอบว่ารหัสทำงานได้ดีพร้อมกับข้อ จำกัด ที่ฉันอธิบายก่อนหน้านี้

คำถามแรกทำไมฉันไม่สามารถอ่านไฟล์ที่ถอดรหัสถ้าโปรแกรมทำงานกับไฟล์ที่ไม่เคยเข้ารหัส?

คำถามที่สองเราสามารถอ่าน Python ในการถอดรหัสไฟล์ได้หรือไม่ ห้องสมุดใดที่สามารถทำได้หรือเป็นไปไม่ได้ แตกไฟล์ PDF ทั้งหมดที่ถอดรหัสได้หรือไม่

ขอบคุณสำหรับเวลาและความช่วยเหลือ !!!

ฉันพบผลลัพธ์เหล่านี้โดยใช้ Python 3.7, Windows 10, Jupiter Notebooks และ Anaconda 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()

ด้วย Tabula ฉันได้รับข้อความ "ไฟล์เอาต์พุตว่าง"

ด้วย PyPDF2 ฉันได้รับเพียง '/ n'

UPDATE 10/3/2556 Pdfminer.six (เวอร์ชั่นพฤศจิกายน 2018)

ผมได้รับผลลัพธ์ที่ดีกว่าการใช้วิธีโพสต์โดยDuckPuncher สำหรับไฟล์ที่ถอดรหัสฉันได้รับเลเบล แต่ไม่ใช่ข้อมูล เกิดขึ้นเช่นเดียวกันกับไฟล์ที่เข้ารหัส สำหรับไฟล์ที่ไม่เคยเข้ารหัสทำงานได้อย่างสมบูรณ์แบบ เมื่อฉันต้องการข้อมูลและเลเบลของไฟล์ที่เข้ารหัสหรือถอดรหัสแล้วรหัสนี้ใช้ไม่ได้สำหรับฉัน สำหรับการวิเคราะห์นั้นฉันใช้pdfminer.sixนั่นคือ Python library ที่เปิดตัวในเดือนพฤศจิกายน 2018 Pdfminer.six มี pycryptodome ในไลบรารี ตามเอกสารของพวกเขา " PyCryptodomeเป็นแพคเกจ Python ในตัวของการเข้ารหัสเบื้องต้นระดับต่ำ"

รหัสอยู่ในคำถามแลกเปลี่ยนสแตก: การ แยกข้อความจากไฟล์ PDF โดยใช้ PDFMiner ใน python หรือไม่

ฉันจะรักถ้าคุณต้องการทำการทดสอบซ้ำ นี่คือคำอธิบาย:

1) เรียกใช้รหัสที่กล่าวถึงในคำถามนี้ด้วย PDF ใด ๆ ที่ไม่เคยมีการเข้ารหัส

2) ทำเช่นเดียวกันกับ PDF "ปลอดภัย" (นี่เป็นคำศัพท์ที่ Adobe ใช้) ฉันเรียกมันว่า PDF ที่เข้ารหัส ใช้แบบฟอร์มทั่วไปที่คุณสามารถหาได้โดยใช้ Google หลังจากดาวน์โหลดแล้วคุณต้องกรอกข้อมูลในฟิลด์ มิฉะนั้นคุณจะตรวจสอบป้ายกำกับ แต่ไม่ใช่สาขา ข้อมูลอยู่ในเขตข้อมูล

3) ถอดรหัสไฟล์ PDF ที่เข้ารหัสโดยใช้ Pykepdf นี่จะเป็นไฟล์ PDF ที่ถอดรหัส

4) เรียกใช้รหัสอีกครั้งโดยใช้ PDF ที่ถอดรหัส

อัพเดท 10/4/2019 คาเมลอต (เวอร์ชั่นกรกฎาคม 2019)

ฉันพบห้องสมุด Python Camelot ระวังว่าคุณต้องการcamelot-py 0.7.3

มันมีประสิทธิภาพมากและทำงานได้กับ Python 3.7 นอกจากนี้ยังใช้งานง่ายมาก ก่อนอื่นคุณต้องติดตั้งGhostscriptด้วย มิฉะนั้นมันจะไม่ทำงาน. คุณต้องติดตั้งPandasด้วย อย่าใช้ pip ติดตั้ง Camelot-PY ใช้pip install ติดตั้ง camelot-py [cv] แทน

ผู้เขียนโปรแกรมคือ Vinayak Mehta Frank Du แชร์รหัสนี้ในวิดีโอ YouTube "ดึงข้อมูลตารางจาก PDF ด้วย Camelot Using Python"

ฉันตรวจสอบรหัสและทำงานกับไฟล์ที่ไม่ได้เข้ารหัส แต่ก็ไม่ได้ทำงานกับไฟล์ที่เข้ารหัสและถอดรหัสและนั่นคือเป้าหมายของฉัน

Camelot มุ่งเน้นที่จะรับตารางจาก PDF

นี่คือรหัส:

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)

UPDATE 10/7/2019 ฉันพบเคล็ดลับหนึ่งข้อ ถ้าฉันเปิดไฟล์ PDF ที่ปลอดภัยด้วย Adobe Reader และฉันพิมพ์โดยใช้ Microsoft เป็น PDF และฉันบันทึกเป็น PDF ฉันสามารถแยกข้อมูลโดยใช้สำเนานั้นได้ ฉันยังสามารถแปลงไฟล์ PDF เป็น JSON, Excel, SQLite, CSV, HTML และรูปแบบอื่น นี่เป็นทางออกที่เป็นไปได้สำหรับคำถามของฉัน อย่างไรก็ตามฉันยังคงมองหาตัวเลือกที่จะทำได้โดยไม่ต้องใช้กลอุบายเพราะเป้าหมายคือทำ 100% กับ Python ฉันกังวลด้วยเช่นกันว่าหากใช้วิธีการเข้ารหัสที่ดีกว่าอาจใช้การไม่ได้ บางครั้งคุณจำเป็นต้องใช้ Adobe Reader หลายครั้งเพื่อรับสำเนาที่คลายบีบอัดได้

อัพเดท 10/8/2019 คำถามที่สาม ตอนนี้ฉันมีคำถามที่สาม ไฟล์ PDF ที่ปลอดภัย / เข้ารหัสทั้งหมดได้รับการป้องกันด้วยรหัสผ่านหรือไม่? ทำไม pikepdf ไม่ทำงาน ฉันเดาว่าเวอร์ชั่นปัจจุบันของ pikepdf สามารถทำลายการเข้ารหัสบางประเภทได้ แต่ไม่ใช่ทั้งหมด @constt พูดถึงว่า PyPDF2 สามารถทำลายการป้องกันบางประเภทได้ อย่างไรก็ตามฉันตอบเขาว่าฉันพบบทความที่ PyPDF2 สามารถทำลายการเข้ารหัสที่ทำด้วย Adobe Acrobat Pro 6.0 แต่ไม่มีในรุ่นหลัง


2
ฉันไม่สามารถทำซ้ำปัญหาเหล่านี้PyPDF2ได้ทุกอย่างทำงานได้ดี ฉันใช้pdftkบริการออนไลน์เพื่อเข้ารหัสไฟล์ คุณสามารถโพสต์ลิงก์ไปยังไฟล์ pdf "ลำบาก" ได้หรือไม่?
constt

1
โอเคขอบคุณ! คุณได้ลองใช้qpdfเพื่อถอดรหัสไฟล์ของคุณหรือไม่? ในกรณีที่มันจะทำเคล็ดลับคุณสามารถโทรจากสคริปต์ของคุณโดยใช้subprocessโมดูลเพื่อถอดรหัสไฟล์ก่อนที่จะแยกพวกเขา
constt

1
อันดับแรก PyPDF2 ไม่สามารถถอดรหัสไฟล์ Acrobat PDF => 6.0 ประการที่สอง pikepdf ในปัจจุบันไม่มีการใช้การแยกข้อความ
ชีวิตมีความซับซ้อน

1
@ ผู้เริ่มต้นฉันจะพิจารณาว่าสิ่งนี้เกี่ยวข้องกับการจัดรูปแบบพื้นฐานที่ pykepdf ใช้ในการเขียน PDF ที่ไม่ได้เข้ารหัส
ชีวิตมีความซับซ้อน

2
"pdf ที่ปลอดภัย / เข้ารหัสทั้งหมดได้รับการป้องกันด้วยรหัสผ่านหรือไม่" - ไม่ นอกจากนี้ยังมีไฟล์ PDF ที่เข้ารหัสโดยใช้การเข้ารหัสคีย์ส่วนตัว / สาธารณะตามใบรับรอง X509
mkl

คำตอบ:


8

อัพเดทล่าสุด 10-11-2019

ฉันไม่แน่ใจถ้าฉันเข้าใจคำถามของคุณอย่างสมบูรณ์ โค้ดด้านล่างสามารถปรับปรุงได้ แต่มันจะอ่านในรูปแบบ PDF ที่เข้ารหัสหรือไม่ได้เข้ารหัสและแยกข้อความ โปรดแจ้งให้เราทราบหากฉันเข้าใจผิดความต้องการของคุณ

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ของคุณที่ใช้ในการเปิด PDF ที่เข้ารหัสนั้นไม่มีรหัสผ่านซึ่งน่าจะเกิดจากข้อความแสดงข้อผิดพลาดนี้:

pikepdf._qpdf.PasswordError :rypt.pdf: รหัสผ่านไม่ถูกต้อง

import pikepdf

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

คุณสามารถใช้ได้ Tikaที่จะดึงข้อความจาก 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


ฉันตัดสินใจรันการทดสอบสองไฟล์โดยใช้ไฟล์ PDF ที่เข้ารหัสต่าง ๆ

ฉันตั้งชื่อไฟล์ที่เข้ารหัสทั้งหมด 'encryption.pdf' และพวกเขาทั้งหมดใช้การเข้ารหัสและรหัสผ่านการถอดรหัสเดียวกัน

  1. Adobe Acrobat 9.0 และใหม่กว่า - ระดับการเข้ารหัส AES 256 บิต

    • pikepdf สามารถถอดรหัสไฟล์นี้ได้
    • PyPDF2 ไม่สามารถแยกข้อความได้อย่างถูกต้อง
    • tika สามารถแยกข้อความได้อย่างถูกต้อง
  2. Adobe Acrobat 6.0 และใหม่กว่า - ระดับการเข้ารหัส 128 บิต RC4

    • pikepdf สามารถถอดรหัสไฟล์นี้ได้
    • PyPDF2 ไม่สามารถแยกข้อความได้อย่างถูกต้อง
    • tika สามารถแยกข้อความได้อย่างถูกต้อง
  3. Adobe Acrobat 3.0 และใหม่กว่า - ระดับการเข้ารหัส 40 บิต RC4

    • pikepdf สามารถถอดรหัสไฟล์นี้ได้
    • PyPDF2 ไม่สามารถแยกข้อความได้อย่างถูกต้อง
    • tika สามารถแยกข้อความได้อย่างถูกต้อง
  4. Adobe Acrobat 5.0 และใหม่กว่า - ระดับการเข้ารหัส 128 บิต RC4

    • สร้างด้วย Microsoft Word
    • pikepdf สามารถถอดรหัสไฟล์นี้ได้
    • PyPDF2 สามารถแยกข้อความได้อย่างถูกต้อง
    • tika สามารถแยกข้อความได้อย่างถูกต้อง
  5. Adobe Acrobat 9.0 และใหม่กว่า - ระดับการเข้ารหัส AES 256 บิต

    • สร้างโดยใช้ pdfprotectfree
    • pikepdf สามารถถอดรหัสไฟล์นี้ได้
    • PyPDF2 สามารถแยกข้อความได้อย่างถูกต้อง
    • tika สามารถแยกข้อความได้อย่างถูกต้อง

PyPDF2 สามารถดึงข้อความจากไฟล์ PDF ที่ถอดรหัสซึ่งไม่ได้สร้างด้วย Adobe Acrobat

ฉันจะสมมติว่าความล้มเหลวเกี่ยวข้องกับการจัดรูปแบบฝังตัวใน PDF ที่สร้างโดย Adobe Acrobat ต้องมีการทดสอบเพิ่มเติมเพื่อยืนยันการคาดการณ์นี้เกี่ยวกับการจัดรูปแบบ

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ไม่สามารถถอดรหัสไฟล์ Acrobat PDF ได้ => 6.0

ปัญหานี้ได้รับการเปิดกับเจ้าของโมดูลตั้งแต่15 กันยายน 2015 มันไม่ชัดเจนในความคิดเห็นที่เกี่ยวข้องกับปัญหานี้เมื่อเจ้าของโครงการจะแก้ไขปัญหานี้ ความมุ่งมั่นล่าสุดคือ 25 มิถุนายน 2018

ปัญหาการถอดรหัสPyPDF4

PyPDF4 ใช้แทน PyPDF2 โมดูลนี้ยังมีปัญหาการถอดรหัสด้วยอัลกอริทึมบางอย่างที่ใช้ในการเข้ารหัสไฟล์ PDF

ไฟล์ทดสอบ: Adobe Acrobat 9.0 และใหม่กว่า - ระดับการเข้ารหัส AES 256 บิต

ข้อความแสดงข้อผิดพลาด PyPDF2: รองรับเฉพาะรหัสอัลกอริทึม 1 และ 2

ข้อความแสดงข้อผิดพลาด PyPDF4: รองรับเฉพาะรหัสอัลกอริทึม 1 และ 2 PDF นี้ใช้รหัส 5


ส่วนการปรับปรุง 10-11-2019

ส่วนนี้อยู่ในการตอบสนองต่อการปรับปรุงของคุณใน 10-07-2019 และ 10-08-2019

ในการอัปเดตของคุณคุณระบุว่าคุณสามารถเปิด 'pdf ปลอดภัยด้วย Adobe Reader' และพิมพ์เอกสารเป็น PDF อื่นซึ่งลบการตั้งค่าสถานะ 'ปลอดภัย' หลังจากทำการทดสอบบางอย่างฉันเชื่อว่าได้เข้าใจสิ่งที่เกิดขึ้นในสถานการณ์นี้

ระดับความปลอดภัยของ Adobe PDF

Adobe PDF มีการควบคุมความปลอดภัยหลายประเภทที่เจ้าของเอกสารสามารถเปิดใช้งานได้ การควบคุมสามารถบังคับใช้ด้วยรหัสผ่านหรือใบรับรอง

  1. การเข้ารหัสเอกสาร (บังคับใช้ด้วยรหัสผ่านเปิดเอกสาร)

    • เข้ารหัสเนื้อหาเอกสารทั้งหมด (พบมากที่สุด)
    • เข้ารหัสเนื้อหาเอกสารทั้งหมดยกเว้นเมทาดาทา => Acrobat 6.0
    • เข้ารหัสไฟล์ที่แนบมาเท่านั้น => Acrobat 7.0
  2. การแก้ไขและการพิมพ์ จำกัด (บังคับใช้ด้วยรหัสผ่านสิทธิ์)

    • อนุญาตการพิมพ์
    • อนุญาตการเปลี่ยนแปลง

ภาพด้านล่างแสดง Adobe PDF ที่ถูกเข้ารหัสด้วยการเข้ารหัส AES 256 บิต ในการเปิดหรือพิมพ์ PDF ต้องใช้รหัสผ่าน เมื่อคุณเปิดเอกสารนี้ใน Adobe Reader กับรหัสผ่านชื่อจะระบุการรักษาความปลอดภัย

password_level_encryption

เอกสารนี้ต้องใช้รหัสผ่านเพื่อเปิดด้วยโมดูล Python ที่กล่าวถึงในคำตอบนี้ หากคุณพยายามเปิด PDF ที่เข้ารหัสด้วย Adobe Reader คุณควรเห็นสิ่งนี้:

password_prompt

หากคุณไม่ได้รับคำเตือนนี้เอกสารอาจไม่มีการควบคุมความปลอดภัยหรือมีการแก้ไขที่ จำกัด และเปิดใช้งานการพิมพ์

ภาพด้านล่างแสดงการแก้ไขที่ จำกัด การเปิดใช้งานด้วยรหัสผ่านในเอกสาร PDF หมายเหตุการพิมพ์ถูกเปิดใช้งาน ในการเปิดหรือพิมพ์ไฟล์ PDF นี้รหัสผ่านที่ไม่จำเป็นต้องใช้ เมื่อคุณเปิดเอกสารนี้ใน Adobe Reader โดยรหัสผ่านชื่อจะระบุการรักษาความปลอดภัย นี่คือคำเตือนเช่นเดียวกับรูปแบบไฟล์ PDF ที่เข้ารหัสที่ถูกเปิดด้วยรหัสผ่าน

เมื่อคุณพิมพ์เอกสารนี้เป็น PDF ใหม่คำเตือนSECUREDจะถูกลบออกเนื่องจากการแก้ไขที่ จำกัด ได้ถูกลบออกไป

password_level_restrictive_editing

ผลิตภัณฑ์ Adobe ทั้งหมดบังคับใช้ข้อ จำกัด ที่กำหนดโดยรหัสผ่านการอนุญาต อย่างไรก็ตามหากผลิตภัณฑ์ของบุคคลที่สามไม่รองรับการตั้งค่าเหล่านี้ผู้รับเอกสารจะสามารถข้ามข้อ จำกัด บางอย่างหรือทั้งหมดได้

ดังนั้นฉันคิดว่าเอกสารที่คุณกำลังพิมพ์ไปยัง PDF นั้นเปิดใช้งานการแก้ไขที่ จำกัด และไม่มีรหัสผ่านที่จำเป็นในการเปิดใช้งาน

เกี่ยวกับการทำลายการเข้ารหัส PDF

ทั้งPyPDF2หรือPyPDF4ถูกออกแบบมาเพื่อทำลายเอกสารฟังก์ชั่นเปิดรหัสผ่านของเอกสาร PDF โมดูลทั้งสองจะแสดงข้อผิดพลาดต่อไปนี้หากพวกเขาพยายามเปิดไฟล์ PDF ที่เข้ารหัสด้วยรหัสผ่านที่เข้ารหัสไว้

PyPDF2.utils.PdfReadError: ไฟล์ยังไม่ได้รับการถอดรหัส

ฟังก์ชันการเปิดรหัสผ่านของไฟล์ PDF ที่เข้ารหัสสามารถข้ามได้โดยใช้วิธีการที่หลากหลาย แต่เทคนิคเดียวอาจไม่ทำงานและบางอย่างอาจไม่สามารถยอมรับได้เนื่องจากปัจจัยหลายประการรวมถึงความซับซ้อนของรหัสผ่าน

การเข้ารหัส PDF ภายในทำงานร่วมกับคีย์เข้ารหัส 40, 128 หรือ 256 บิตขึ้นอยู่กับรุ่น PDF คีย์การเข้ารหัสลับแบบไบนารีนั้นได้มาจากรหัสผ่านที่ได้รับจากผู้ใช้ รหัสผ่านขึ้นอยู่กับความยาวและข้อ จำกัด ในการเข้ารหัส

ตัวอย่างเช่น PDF 1.7 Adobe Extension Level 3 (Acrobat 9 - AES-256) แนะนำอักขระ Unicode (65,536 ตัวอักษรที่เป็นไปได้) และชนความยาวสูงสุดถึง 127 ไบต์ในการแสดงรหัสผ่าน UTF-8


รหัสด้านล่างจะเปิด PDF ที่เปิดใช้งานการแก้ไขที่ จำกัด มันจะบันทึกไฟล์นี้เป็น PDF ใหม่โดยไม่เพิ่มคำเตือน SECURED Tikaรหัสจะแยกเนื้อหาจากไฟล์ใหม่

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
คุณจะเปิดไฟล์ PDF ที่ปลอดภัยโดยไม่ต้องใส่รหัสผ่านได้อย่างไร
ชีวิตมีความซับซ้อน

1
คุณหมายถึงการป้องกันการแก้ไขที่ จำกัด เท่านั้น?
ชีวิตมีความซับซ้อน

1
ตอบรับการอัปเดตด้วยรหัสที่ทำงานกับ PDF ที่เปิดใช้งานการป้องกันการแก้ไขอย่าง จำกัด แต่อนุญาตให้พิมพ์ได้
ชีวิตมีความซับซ้อน

1
คุณใช้ XHTML ได้ไหม?
ชีวิตมีความซับซ้อน

1
ฉันแก้ไขคำตอบของผลลัพธ์ XHTML JSON เป็นไปได้ แต่มันต้องขุดลงในรหัสโครงการ GitHub ที่เกี่ยวข้องกับตัวแยกวิเคราะห์ tika
ชีวิตมีความซับซ้อน

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 ที่ส่งคืนสำหรับการวิเคราะห์คำของคุณ นอกจากนี้คุณสามารถให้รหัสผ่านในกรณีที่คุณมี PDF ที่เข้ารหัส


1
ขอบคุณสำหรับคำตอบ! เราพยายามอ่านโดยไม่มีรหัสผ่าน ในเวลานี้เราสามารถทำได้ด้วยวิธีการที่อธิบายไว้ใน UPDATE ของฉัน
เริ่มต้น

สิ่งนี้อยู่ไกลจากการตอบคำถาม ดูเหมือนว่าคุณยังไม่ได้อ่านคำถามทั้งหมด
Shoonya ek

1
สิ่งนี้จะจัดการกับไฟล์ PDF ที่ปลอดภัยเหล่านั้นซึ่ง pikepdf ปกติจะล้มเหลวเมื่อค่าเริ่มต้นของรหัสผ่านคือไม่มี โดยผ่านสตริงว่างเปล่ามันสามารถเปิดและแยกเอกสาร PDF ที่ปลอดภัยได้อย่างถูกต้อง (ในกรณีทดสอบที่ฉันวิ่ง)
Mahendra Singh

1
@ ผู้เริ่มต้นคุณไม่ต้องแปลงไฟล์ PDF ที่นี่ในกรณีนี้ นี่เป็นเพียงจากประสบการณ์ก่อนหน้าของฉันที่มีความปลอดภัยไฟล์ PDF ทำงานโดยให้รหัสผ่านว่าง
Mahendra Singh

1
@ ผู้เริ่มต้นนี่คือรหัสทั้งหมดของฉัน นี่จะส่งคืน pdf_object จาก pikepdf เท่านั้น ในกรณีที่คุณต้องการบันทึกไฟล์ PDF นี้เพียงบันทึกวัตถุที่ส่งคืนโดยใช้ pdf_obj.save ('your_file_path') หลังจากนี้คุณสามารถใช้ PDF นี้เพื่อวิเคราะห์ข้อความและวัตถุอื่น ๆ ฉันใช้ไลบรารีชื่อPdfPlumberสำหรับการแยกข้อความ
Mahendra Singh เมื่อ

1

สำหรับ tabula-py คุณสามารถลองใช้ตัวเลือกรหัสผ่านด้วย read_pdf มันขึ้นอยู่กับฟังก์ชั่นของ tabula-java ดังนั้นฉันไม่แน่ใจว่ารองรับการเข้ารหัสใด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.