วิธีการทำ PDF Extraction ด้วย Python
Tags: thai, pdfextraction, python
Published: 2020-09-26 13:41:25

---
title: วิธีการทำ PDF Extraction ด้วย Python
published: true
date: 2020-09-25 17:00:00 UTC
tags: thai,pdfextraction,python
canonical_url: https://narongdej.dev/blog/th/2020/09/26/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%97%E0%B9%8D%E0%B8%B2-pdf-extraction-%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2-python
---

ในยุคที่ข้อมูลเป็นสิ่งที่มีค่าสูง หากคนมีข้อมูลเยอะ คุณสามารถเอามาทำ Data Analysis เพื่อวางแผนการตลาด หรือคุณสามารถเอามาทำ Data Science เพื่อผลิตเครื่องมือใหม่ๆ แต่สิ่งที่คุณต้องมีให้ได้ก่อน นั่นคือมี Data

วันนี้ผมจะมาพูดถึงเครื่องมือการ Extract ข้อมูลจากไฟล์ PDF ที่เป็นวิธีการเก็บไฟล์ที่นิยมของหลายๆบริษัท ผมจะแค่เกริ่นสั้นๆ ถึงวิธีการ extract ต่างๆ แต่จะยังไม่ลงลึก วิธีการทำใน blog นี้ ถ้าหากคุณสนใจการ extract วิธีไหนที่กล่าวใน blog นี้ สามารถเขียน comment ทิ้งไว้ได้ครับ แล้วผมจะพยายามเขียน blog อธิบายลงลึกอีกที

## Structured Data vs Non Structured Data

ก่อนอื่นเราต้องมารู้จักกับสิ่งที่เรียกว่า Structured Data กับสิ่งที่เรียกว่า Non Structured Data กันก่อน

Data สามารถแบ่งออกเป็นสองประเภทนี้

**Structured Data**

1. ข้อมูลที่เก็บใน relational database เช่น Postgres, MySQL หรือที่สามารถแสดงเป็น rows, column ได้
2. ข้อมูลเป็นประเภท ตัวเลข วันที่ และตัวหนังสือ

**Unstructured Data**

1. ไม่สามารถแสดงเป็น rows, column และไม่ได้เก็บอยู่ใน relational database
2. เป็นไฟล์จำพวก รูปภาพ คลิปเสียง วีดีโอ ไฟล์ Word, Email, Spreadsheet

ข้อเสียหลักๆของ unstructured data คือการนำออกมาใช้ยาก เพราะฉะนั้นหน้าที่หลักๆของการทำ extraction คือ_การแปลง unstructured data ให้กลายเป็น structured ให้ได้_

## Searchable and Non-Seachable

PDF หรือ Portable Document Format เป็นประเภทไฟล์ที่ Adobe สร้างขึ้น ใน PDF นั้นสามารถมี text, image, vector graphic, image และอื่นๆอีกมากมาย

ส่วนใหญ่เวลาเราทำ extraction ข้อมูลที่เราต้องการเอาออกมาก็คือ ตัวหนังสือ หรือตัวเลขที่อยู่ในไฟล์ PDF

ถ้าเราโชคดี ในไฟล์ PDF นั้น text ที่เราจะดึงออกมาจะถูกเก็บแบบเป็น “Text data” ซึ่งสามารถดึงออกมาได้ง่ายและแม่นยำ วิธีการเช็คง่ายๆ ก็ลองเปิดไฟล์ PDF และลาก text ดู ว่าสามารถ highlight text ได้ไหม ผมเรียกไฟล์เหล่านี้ว่า Searchable PDF

ไฟล์อีกประเภทนึง คือไฟล์ที่เหมือนจะเป็นไฟล์ text ที่แปลงมาจากโปรแกรมอื่น แต่จริงๆแล้วเป็นไฟล์ image ที่ถูกแสกนขึ้นมา ทำให้เราไม่สามารถไปอ่าน Text Data ได้ เพราะมันคือรูปภาพ ผมเรียกไฟล์ประเภทนี้ว่า Non-Searchable PDF

⚠️ จงระวัง Fake Searchable หรือ ชื่อที่ผมใช้เรียกไฟล์ที่ถูกแปลงจาก Non-Searchable ให้กลายเป็น Searchable ด้วยโปรแกรมเช่น Acrobat Pro

เท่าที่เจอมา ข้อมูลที่ถูกแปลงมาจะนำมาใช้งานไม่ได้เลย แนะนำให้ลองลากและ copy text ออกมาดูว่า มันใช้งานได้ไหม ถ้าใช้ไม่ได้ อาจจะเป็นไฟล์แบบ Fake Searchable

## Free Searchable PDF Extraction

การ Extract ข้อมูลจากไฟล์ Searchable นั้น ผมแนะนำให้ลองไปใช้

1. [PDF Plumber](https://github.com/jsvine/pdfplumber)

PDF Plumber สามารถ extract text, images, และแม้กระทั่งข้อมูลที่อยู่ใน format ของ table และนำออกมาเป็น DataFrame ให้ได้เลย หากข้อมูลที่ extract ไม่ถูกต้อง ให้ลองไปปรับ config ต่างๆที่อยู่ใน README ดู ผมเชื่อว่าสำหรับไฟล์ส่วนใหญ่ คุณสามารถ extract ด้วย PDF Plumber ได้เลย โดยแทบไม่ต้องทำอะไรเพิ่มเติมเลย

สำหรับไฟล์ประเภท Table ต่างๆ และใช้ PDF Plumber ก็ยังไม่เวิร์ค ผมแนะนำให้ไปลอง

1. [Camelot](https://camelot-py.readthedocs.io)
2. [Tabula-py](https://tabula-py.readthedocs.io/en/latest/)

## Free Non-searchable PDF Extraction

สำหรับไฟล์ประเภท Non-Searchable นั่น การ extract ออกมานั้นยากกว่า Searchable เยอะเลย คุณต้องใช้ OCR (Optical Character Recognition) เพื่อแปลงตัวอักษรและตัวเลขจากภาพ ให้กลายเป็น “Text data”

สำหรับข้อมูลที่คุณต้องการเป็น paragraph คุณสามารถแยกภาพ paragraph นั้นออกมา และโยนเข้าไปในโปรแกรม OCR ได้เลย

แต่หลายๆครั้งข้อมูลที่คุณต้องการจะอยู่ใน table ถ้าคุณโยน table เข้า OCR เลย สิ่งที่คุณได้กลับมาจะเละตุ๋มเป๊ะ วิธีการที่ผมทำแล้วผมว่าเวิร์ค คือพยายามตัด text ออกออกมาเป็นเป็นกล่องๆ แล้วค่อยประกอบ table กลับมาใหม่ แต่การที่คุณจะทำอย่างนั้นได้คุณจะต้องมีความรู้เรื่อง Image Processing พอสมควร

พวกหัวข้อที่เกี่ยวข้องคือพวกการทำ [Hough lines](https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html) และการหา [Contours](https://docs.opencv.org/3.4/d4/d73/tutorial_py_contours_begin.html) สองอย่างนี้จะช่วยให้คุณหาเส้นของ table ใน image ได้ เพื่อหาว่าจุดที่คุณจะต้องเอาออกมาอยู่ตรงไหน

**เครื่องมือสำหรับ Image Processing / PDF Processing**

1. [imagemagick](https://imagemagick.org)
2. [OpenCV](https://opencv.org)
3. [ghostscript](https://www.ghostscript.com)

สิ่งที่สำคัญที่คุณควรจะตระหนักไว้ตลอดเวลาคือ ณ ปัจจุบัน OCR ไม่มีทางแปลงข้อมูลออกมาได้ถูก 100% เพราะฉะนั้นคุณต้องระวัง ว่าข้อมูลที่คุณต้องการนำออกมาใช้ สามารถมีการผิดได้บ้าง

คุณสามารถลองใช้ OCR program เช่น [tesserocr](https://github.com/sirfz/tesserocr) ที่เป็น wrapper ของ Tesseract หรือถ้าไม่เวิร์คก็ลอง[เขียน model OCR ขึ้นมาเอง](https://narongdej.dev/blog/th/2020/02/29/train-cnn-to-read-mnist-number-with-keras-and-plaidml)ก็ได้นะครับ

## Commercial Tools

นอกจากการใช้ tools ฟรี นั้นก็มี tools ที่เสียตังค์และสามารถใช้งานการ extract ได้ดีมากๆอยู่สองตัวที่ผมอยากแนะนำก็คือ

1. [ABBYY FineReader](https://pdf.abbyy.com)
2. [Google Vision AI](https://cloud.google.com/vision)

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