วิธีการแยกข้อความจาก PDF? [ปิด]


152

ใครสามารถแนะนำไลบรารี่ / API สำหรับการแยกข้อความและรูปภาพจาก PDF? เราจำเป็นต้องสามารถรับข้อความที่อยู่ในพื้นที่ที่รู้จักกันดีของเอกสารดังนั้น API จะต้องให้ข้อมูลตำแหน่งของแต่ละองค์ประกอบบนหน้าเรา

เราต้องการให้ข้อมูลนั้นส่งออกในรูปแบบxmlหรือ jsonขณะนี้เรากำลังดูPdfTextStreamซึ่งดูค่อนข้างดี แต่อยากได้ยินประสบการณ์และคำแนะนำจากคนอื่น ๆ

มีทางเลือก (รายการเชิงพาณิชย์หรือฟรี) สำหรับการแยกข้อความจาก pdf โดยทางโปรแกรมหรือไม่



1
สำหรับผู้ที่ต้องบางสิ่งบางอย่างมันง่าย (ไม่มีข้อมูลตำแหน่ง), regex Perl /^\s*\[?\((.*?)\)\]?\s*T[Jj]/mgนี้อาจพอเพียง: มันแค่มองหาตัวดำเนินการ Tj / TJ ซึ่งหมายถึงข้อความปกติทั้งหมดในรูปแบบ PDF
Alex R

1
ใช้TomRoush PdfBox ไลบรารี่นี้ใช้งานได้ดีกับ android
FaisalAhmed

คำตอบ:


113

ฉันได้รับไฟล์ PDF ขนาด 400 หน้าพร้อมตารางข้อมูลที่ฉันต้องนำเข้า - ไม่มีรูปโชคดี Ghostscript ใช้งานได้สำหรับฉัน:

gswin64c -sDEVICE=txtwrite -o output.txt input.pdf

ไฟล์เอาต์พุตถูกแบ่งออกเป็นหน้าที่มีส่วนหัวและอื่น ๆ แต่มันง่ายที่จะเขียนแอปเพื่อตัดบรรทัดว่างเปล่าและดูดข้อมูลทั้งหมด 30,000 รายการ -dSIMPLEและ-dCOMPLEXไม่ได้สร้างความแตกต่างในกรณีนี้


37
บน Linux และ Cygwin คำสั่งแทนgs gswin64cทำงานได้อย่างสมบูรณ์แบบ ไม่มีอึจ่ายที่ได้รับสิทธิบัตร มันใช้งานได้
Jannes

4
ใช่ใช้งานได้ดี! ตอนนี้ฉันสามารถใช้ "grep" กับการยกเว้นโทษในไฟล์ pdf ของฉัน เนื่องจากฉันสามารถ grep ดีกว่าที่ฉันสามารถอ่านได้มันเป็นชัยชนะ! (:-) โหวตขึ้น
David Elson

1
ปัญหาเดียวที่ฉันมีกับสิ่งนี้คือการใช้มันในไฟล์ PDF ที่มีแบบอักษร 'เก่า' ฝังอยู่ ทำงานได้อย่างสมบูรณ์แบบสำหรับไฟล์ PDF ที่สร้างขึ้นในท้องถิ่น แต่ยากขึ้นกับแหล่งที่ไม่ชัดเจน มิฉะนั้นสคริปต์ที่ยอดเยี่ยม
Jon M

สิ่งที่ไม่-sDEVICE=txtwriteทำอะไร? ฉันไม่เข้าใจมากหลังจากอ่านวิธีใช้ Ghostscript | การเลือกอุปกรณ์เอาต์พุต
Ooker

สำหรับการส่งออก stdout แทนการบันทึกเป็นไฟล์ข้อความ, gswin64c -sDEVICE=txtwrite -o- input.pdfการใช้งาน แหล่งที่มา (ฉันเปลี่ยนไปเล็กน้อย): gist.github.com/drmohundro/560d72ed06baaf16f191ee8be34526ac
LuH

33

ตั้งแต่วันนี้ฉันรู้ว่ามันคือสิ่งที่ดีที่สุดสำหรับการสกัดข้อความจากไฟล์ PDFเป็นTET, ชุดเครื่องมือสกัดข้อความ TET เป็นส่วนหนึ่งของตระกูลผลิตภัณฑ์ PDFlib.com

PDFlib.com เป็น บริษัท ของ Thomas Merz ในกรณีที่คุณไม่รู้จักชื่อของเขา: Thomas Merz เป็นผู้แต่ง "PostScript และ PDF Bible"

ชาติแรก TET เป็นห้องสมุด สิ่งนั้นอาจทำทุกสิ่งที่ Budda006 ต้องการรวมถึงข้อมูลตำแหน่งเกี่ยวกับองค์ประกอบทั้งหมดในหน้า โอ้และยังสามารถแยกรูปภาพ มันรวมรูปภาพที่แยกส่วนเป็นชิ้น ๆ

pdflib.com มีชาติของเทคโนโลยีนี้อีกTET ปลั๊กอินสำหรับ Acrobat และชาติที่สามคือPDFlib TET iFilter นี่เป็นเครื่องมือแบบสแตนด์อโลนสำหรับเดสก์ท็อปผู้ใช้ ทั้งสองอย่างนี้ฟรี (เหมือนในเบียร์) เพื่อใช้เพื่อวัตถุประสงค์ส่วนตัวและไม่ใช่เพื่อการค้า

และมันทรงพลังจริงๆ วิธีที่ดีกว่าการแยกข้อความของ Adobe เอง มันแยกข้อความสำหรับฉันที่เครื่องมืออื่น ๆ (รวมถึง Adobe) ทำคายขยะเท่านั้น

ฉันเพิ่งทดสอบเครื่องมือแบบสแตนด์อโลนของเดสก์ท็อปและสิ่งที่พวกเขาพูดบนหน้าเว็บเป็นเรื่องจริง มันมี commandline ที่ดีมาก ไฟล์ทดสอบ PDF "ที่เป็นปัญหา" ของฉันซึ่งเป็นเครื่องมือที่จัดการเพื่อความพึงพอใจของฉัน

สิ่งนี้จะเป็นคำแนะนำของฉันสำหรับทุกความต้องการการสกัดข้อความ PDF ที่ซับซ้อนและท้าทาย

TET ยอดเยี่ยมมาก ตรวจพบตาราง ภายในตารางจะระบุเซลล์ที่ครอบคลุมหลายคอลัมน์ มันระบุแถวตารางและเนื้อหาของแต่ละตารางเซลล์แยกจากกัน มันจัดการได้ดีมากกับการใส่ยติภังค์: มันจะลบยัติภังค์และเรียกคืนคำที่สมบูรณ์ รองรับภาษาที่ไม่ใช่ ASCII (รวมถึง CJK, อาหรับและฮิบรู) เมื่อเผชิญหน้ากับหนังสติ๊กมันจะคืนค่าตัวละครดั้งเดิม ...

ให้มันลอง.


32
ไม่มีรุ่นทดลองใช้และ $ 440 นั้นค่อนข้างมากสำหรับ "ลองดู"
Rok Strniša


บริการนี้ให้บริการผ่าน API หรือไม่
บาร์ต

1
ฉันทดสอบมันไม่รู้จักคอลัมน์ ฉันสแกนหน้าแรกของแท็บลอยด์ภาษาอังกฤษ ข้อความถูกแบ่งออกเป็น 3 คอลัมน์บนกระดาษ แต่ปลั๊กอินนี้ผสมประโยคทั้งหมดเข้าด้วยกันทำให้ดูไม่ชัด Ghostscript ซึ่งฟรีมีเอาต์พุตเหมือนกันทุกประการ
NoWhereToBeSeen

1
@RedHotScalability: เช่นเดียวกับ BTW TET จะจดจำ colums หากใช้กับพารามิเตอร์ที่ถูกต้อง แต่ฉันปล่อยให้มันเป็นแบบฝึกหัดให้ผู้อ่าน JS ที่มีความทะเยอทะยานเพื่ออ่านเอกสารและค้นหาว่า ...
Kurt Pfeifle

29

เครื่องมือบรรทัดคำสั่งที่มีประสิทธิภาพโอเพนซอร์สฟรีไม่มีค่าใช้จ่ายใด ๆ ที่มีอยู่ในทั้ง linux & windows: เพียงแค่ชื่อ pdftotext เครื่องมือนี้เป็นส่วนหนึ่งของไลบรารี xpdf

http://en.wikipedia.org/wiki/Pdftotext


4
บน sidenote: ใช้-layoutสวิตช์เพื่อรักษาตารางทำงานได้ดี
เซบาสเตียน


12

นี่คือคำแนะนำของฉัน หากคุณต้องการแยกข้อความจาก PDF คุณสามารถนำเข้าไฟล์ pdf ลงใน Google เอกสารแล้วส่งออกเป็นรูปแบบที่เป็นมิตรเช่น. html, .odf, .rtf, .txt เป็นต้นทั้งหมดนี้ใช้ Drive API . มันฟรีและแข็งแกร่ง ดูที่:

https://developers.google.com/drive/v2/reference/files/insert https://developers.google.com/drive/v2/reference/files/get

เนื่องจากเป็น API ส่วนที่เหลือจึงเข้ากันได้กับทุกภาษาโปรแกรม ลิงก์ที่ฉันโพสต์ aboove มีตัวอย่างการทำงานสำหรับหลายภาษา ได้แก่ : Java, .NET, Python, PHP, Ruby และอื่น ๆ

ฉันหวังว่ามันจะช่วย


2
ฉันใช้ตัวเลือกนั้นแล้วฉันจะไม่แนะนำ การแยกข้อความ PDF ของ Google นั้นไม่ได้ดีเท่ากับตัวเลือกอื่น ๆ (โดยเฉพาะสำหรับผู้ที่ไม่ใช้ภาษาอังกฤษ) และมันก็แย่มากเช่นกัน
Björn Lindqvist

10

PdfTextStream (ซึ่งคุณบอกว่าคุณดูแล้ว) ตอนนี้ฟรีสำหรับแอปพลิเคชั่นเธรดเดี่ยว ในความคิดของฉันคุณภาพของมันดีกว่าไลบรารี่อื่น ๆ

หรือคุณควรดูApache PDFBoxโอเพนซอร์ส


PdfTextStream ไม่รองรับใน Android มีห้องสมุดที่ดีเช่นนี้สำหรับ Android หรือไม่?
FaisalAhmed

@FaisalAhmed PDFBox เป็นอย่างไรบ้าง?
Renaud

ใช่ PdfBox ไม่รองรับใน Android .... ทั้ง PdfTextStream และ PdfBox ใช้บางส่วน awt ซึ่งไม่รองรับใน Android
FaisalAhmed

ฉันใช้ไลบรารีนี้ซึ่งใช้งานได้ดีกับ android github.com/TomRoush/PdfBox-Android
FaisalAhmed

6

Docotic.Pdf libraryอาจใช้เพื่อแยกข้อความจากไฟล์ PDFเป็นข้อความธรรมดาหรือเป็นกลุ่มของข้อความที่มีพิกัดสำหรับแต่ละอัน

Docotic.Pdf สามารถใช้เพื่อแยกรูปภาพจาก PDFได้เช่นกัน

คำเตือน: ฉันทำงานให้กับ Bit Miracle


6

หนึ่งในความคิดเห็นที่นี่ใช้ gs บน Windows ฉันประสบความสำเร็จกับ Linux / OSX ด้วยเช่นกันด้วยไวยากรณ์ต่อไปนี้:

gs \
 -q \
 -dNODISPLAY \
 -dSAFER \
 -dDELAYBIND \
 -dWRITESYSTEMDICT \
 -dSIMPLE \
 -f ps2ascii.ps \
 "${input}" \
 -dQUIET \
 -c quit

ฉันใช้dSIMPLEแทนdCOMPLEXเพราะตัวหลังจะให้ผลลัพธ์ 1 อักขระต่อบรรทัด


5

เนื่องจากคำถามนี้เกี่ยวกับเครื่องมือทางเลือกเพื่อรับข้อมูลจากPDF เป็น XMLดังนั้นคุณอาจสนใจดูเครื่องมือทางการค้า"ByteScout PDF Extractor SDK"ที่สามารถทำสิ่งนี้ได้อย่างสมบูรณ์: แยกข้อความจาก PDF เป็น XML พร้อมกับ ข้อมูลตำแหน่ง (x, y) และข้อมูลตัวอักษร:

ข้อความในแหล่ง PDF:

Products | Units | Price 

เอาต์พุต XML:

 <row>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="212" y="126" width="47" height="11">Products</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="428" y="126" width="27" height="11">Units</text> 
  </column>
 <column>
  <text fontName="Arial" fontSize="11.0" fontStyle="Bold" x="503" y="126" width="26" height="11">Price</text> 
  </column>
</row>

PS: นอกจากนี้มันยังแบ่งข้อความออกเป็นโครงสร้างตามตาราง

การเปิดเผยข้อมูล: ฉันทำงานกับ ByteScout


3

สิ่งที่ดีที่สุดในขณะนี้ผมสามารถคิด (ภายในรายการ "ง่าย" เครื่องมือ) เป็นGhostscript (รุ่นปัจจุบันคือ v.8.71) ps2ascii.psและยูทิลิตี้โปรแกรม Ghostscript จัดส่งในlibไดเรกทอรีย่อย ลองนี้ (บน Windows):

gswin32c.exe ^
   -q ^
   -sFONTPATH=c:/windows/fonts ^
   -dNODISPLAY ^
   -dSAFER ^
   -dDELAYBIND ^
   -dWRITESYSTEMDICT ^
   -dCOMPLEX ^
   -f ps2ascii.ps ^
   -dFirstPage=3 ^
   -dLastPage=7 ^
   input.pdf ^
   -dQUIET ^
   -c quit

คำสั่งนี้จะประมวลผลหน้า 3-7 input.pdfของ อ่านความคิดเห็นในps2ascii.psไฟล์ของตัวเองเพื่อดูว่า "แปลก" ตัวเลขและข่าวสารเพิ่มเติมหมายถึงอะไร ( พวกเขาระบุสตริง, ตำแหน่ง, ความกว้าง, สี, ภาพ, สี่เหลี่ยม, แบบอักษรและตัวแบ่งหน้า ... ) เพื่อให้ได้ "ง่าย" เอาท์พุทข้อความแทนที่ส่วนหนึ่งเกิดจาก-dCOMPLEX-dSIMPLE


2
อย่างที่คุณคาดเดานี่เป็นแค่การทดสอบ ASCII เท่านั้น ในขณะที่ฟรีไม่ใช่ตัวเลือกที่ยอดเยี่ยมสำหรับซอฟต์แวร์ที่คุณวางแผนจะใช้กับภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ
userx

3
@userx: อย่างที่คุณเดาได้นี่คือซอฟต์แวร์ฟรี: ดังนั้นจึงมีซอร์สโค้ด เป็นไปได้ที่จะขยายเพื่อรองรับ non-ASCII ...
Kurt Pfeifle

@userx: วันนี้ฉันค้นพบ 'TET' ซึ่งเป็นเครื่องมือสกัดข้อความจาก pdflib.com ดูคำตอบอื่นของฉัน
Kurt Pfeifle

ps2asciiจาก Ghostscript 9.07 ทำงานได้อย่างสวยงามบนระบบ OpenBSD ของฉัน ฉันเพิ่งแปลง PDF 526 หน้าเป็นข้อความธรรมดา ตอนนี้ฉันสามารถ grep และแยกข้อความสำหรับบันทึกได้อย่างง่ายดาย ps2ascii book.pdf notes.txtผมใช้คำสั่งง่ายๆ หากเอกสารของคุณมี ASCII เป็นส่วนใหญ่คุณจะโชคดี
Clint Pachl

3

ฉันรู้ว่าหัวข้อนี้ค่อนข้างเก่า แต่ความต้องการนี้ยังมีชีวิตอยู่ ฉันอ่านเอกสารฟอรัมและสคริปต์จำนวนมากและสร้างขั้นสูงใหม่ซึ่งรองรับไฟล์บีบอัดและไม่บีบอัด:

https://gist.github.com/smalot/6183152

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

หวังว่าจะช่วยให้ทุกคน



2

Apache pdfbox มีคุณสมบัตินี้ส่วนข้อความอธิบายไว้ใน:

http://pdfbox.apache.org/apidocs/org/apache/pdfbox/util/PDFTextStripper.html

สำหรับตัวอย่างการนำไปปฏิบัติให้ดูที่ https://github.com/WolfgangFahl/pdfindexer

testcase TestPdfIndexer.testExtracting แสดงให้เห็นว่ามันทำงานอย่างไร



0

สำหรับระบบ Macintosh ของฉันฉันพบว่า "Adobe Reader" ทำงานได้ดีพอสมควร ฉันสร้างนามแฝงบนเดสก์ท็อปของฉันซึ่งชี้ไปที่ "Adobe Reader.app" และสิ่งที่ฉันทำคือวางไฟล์ PDF ลงบนนามแฝงซึ่งทำให้เป็นเอกสารที่ใช้งานอยู่ใน Adobe Reader จากนั้นจากเมนูไฟล์ ฉันเลือก "บันทึกเป็นข้อความ ... " ตั้งชื่อและสถานที่ที่จะบันทึกคลิก "บันทึก" และฉันทำเสร็จแล้ว


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