ฉันเพิ่งสำเร็จการศึกษาด้านคณิตศาสตร์บริสุทธิ์ซึ่งมีหลักสูตรการเขียนโปรแกรมขั้นพื้นฐานเพียงไม่กี่หลักสูตรเท่านั้น ฉันกำลังฝึกงานและฉันมีโครงการวิเคราะห์ข้อมูลภายใน ฉันต้องวิเคราะห์ 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 แต่ไม่มีในรุ่นหลัง
qpdf
เพื่อถอดรหัสไฟล์ของคุณหรือไม่? ในกรณีที่มันจะทำเคล็ดลับคุณสามารถโทรจากสคริปต์ของคุณโดยใช้subprocess
โมดูลเพื่อถอดรหัสไฟล์ก่อนที่จะแยกพวกเขา
PyPDF2
ได้ทุกอย่างทำงานได้ดี ฉันใช้pdftk
บริการออนไลน์เพื่อเข้ารหัสไฟล์ คุณสามารถโพสต์ลิงก์ไปยังไฟล์ pdf "ลำบาก" ได้หรือไม่?