2 กันยายน 2569 · อ่าน 2 นาที
วิธีดึงข้อความจาก PDF และเอกสารสแกนภาษาไทย
ทำไมการคัดลอกข้อความจาก PDF ภาษาไทยจึงได้วรรณยุกต์เพี้ยน อักษรขยะ และวลีติดกันเป็นพืด และ OCR ภาษาไทยคืนทั้งหน้ากลับมาเป็นข้อความ หัวข้อ และตารางได้อย่างไร
PDF ภาษาไทยให้ข้อความออกมาได้สองทาง ไฟล์ที่มีชั้นข้อความคัดลอกได้ทันที ส่วนไฟล์สแกนต้องให้ OCR อ่าน โดยมองหน้ากระดาษเป็นภาพแล้วเขียนข้อความกลับออกมา
ปัญหาคือชั้นข้อความของ PDF ภาษาไทยมักเก็บข้อความที่เพี้ยนไว้ ทั้งที่หน้ากระดาษพิมพ์ออกมาถูกต้องทุกตัว วรรณยุกต์เรียงผิดลำดับ ฟอนต์รุ่นเก่าคัดลอกออกมาเป็นอักษรละตินขยะ ทั้งวลีติดกันมาเป็นก้อนเดียว และเลขไทยกับเลขอารบิกอยู่บนบรรทัดเดียวกัน บทความนี้แสดงความผิดพลาดแต่ละแบบพร้อมสายอักขระที่ได้จริง อธิบายว่าเมื่อไรควรใช้ OCR และ OCR เอกสารคืนอะไรกลับมาจากใบแจ้งหนี้ไทยจริงหนึ่งใบ
PDF ภาษาไทยมีสองแบบ#
PDF ที่ส่งออกจากโปรแกรมพิมพ์เอกสาร ระบบบัญชี หรือเบราว์เซอร์ มีชั้นข้อความอยู่ข้างใน ตัวอักษรบนหน้าถูกวาดจากฟอนต์ และรหัสอักขระเบื้องหลังถูกเก็บไว้ในไฟล์ กดเลือกทั้งหมดแล้วคัดลอก จะมีบางอย่างออกมาเสมอ
PDF จากเครื่องสแกน กล้องโทรศัพท์ หรือระบบแฟกซ์ คือกล่องใส่รูปภาพ หน้ากระดาษเป็นพิกเซลล้วน กดเลือกทั้งหมดจะไม่ได้อะไร ค้นหาก็ไม่เจอ จนกว่าจะมีตัวอ่านแปลงพิกเซลเป็นอักขระให้
แยกสองแบบนี้ได้ด้วยการตรวจสองอย่าง ค้นหาคำที่เห็นอยู่บนหน้า ถ้าค้นไม่เจอทั้งที่คำนั้นอยู่ตรงหน้า หน้านั้นคือรูปภาพ ลากเลือกข้อความหนึ่งบรรทัด ถ้าแถบเลือกครอบทั้งหน้าเป็นสี่เหลี่ยมก้อนเดียว หรือไม่ขึ้นอะไรเลย หน้านั้นคือรูปภาพ เอกสารไทยจริงจำนวนมากเป็นแบบผสม แบบฟอร์มที่พิมพ์เป็นชั้นข้อความ แต่ตราประทับ ลายเซ็น และข้อความเขียนเพิ่ม เป็นรูปภาพซ้อนอยู่ด้านบน
ทำไมชั้นข้อความของ PDF ภาษาไทยจึงเพี้ยน#
การดึงข้อความภาษาอังกฤษมีจุดพังที่พบบ่อยอยู่จุดเดียว คือช่องว่างระหว่างคอลัมน์หายไป ภาษาไทยมีสี่จุด และแต่ละจุดให้ข้อความที่ดูเหมือนถูก จนกว่าคนไทยหรือฐานข้อมูลจะได้อ่านมัน
วรรณยุกต์และสระเรียงผิดลำดับ#
พยางค์ไทยซ้อนเครื่องหมายไว้ทั้งบนและล่างพยัญชนะ คำว่า กุ้ง คือรหัสสี่ตัวเรียงตามลำดับยูนิโค้ด และชั้นข้อความที่ถูกต้องเก็บตามลำดับนั้น แต่โปรแกรมสร้าง PDF ที่วางอักษรทีละตัวอาจเก็บวรรณยุกต์ไว้ก่อนสระ เพราะมันวาดวรรณยุกต์ก่อน บางโปรแกรมไม่เก็บเครื่องหมายเป็นอักขระเลย แต่วาดเป็นภาพวางตำแหน่งไว้แทน
กุ้ง as written U+0E01 ก base consonant U+0E38 ุ vowel below U+0E49 ้ tone mark above U+0E07 ง final consonant ก ้ ุ ง the same four, as one PDF stores them ก ง the same word, marks placed as art
ทั้งสองกรณีดึงออกมาเป็นสายอักขระที่แสดงผลเกือบถูก แต่จับคู่กับอะไรไม่ได้เลย ค้นหา กุ้ง ไม่เจอ ฐานข้อมูลที่เก็บค่านี้ไว้เชื่อมตารางไม่ติด และงานแปลปลายทางอ่านเป็นคนละคำ ขณะที่หน้ากระดาษเองดูถูกต้องตลอดทั้งหน้า
ฟอนต์รุ่นเก่าคัดลอกออกมาเป็นอักษรละตินขยะ#
เอกสารไทยยุคก่อนยูนิโค้ดแพร่หลายถูกจัดหน้าด้วยรหัส TIS-620 และฟอนต์ที่มีตารางอักขระเป็นของตัวเอง ไฟล์เหล่านั้นยังหมุนเวียนอยู่ แบบฟอร์มราชการ สัญญา และโฉนดยังพิมพ์ซ้ำจากไฟล์กลุ่มนี้ PDF ที่สร้างจากไฟล์แบบนี้มีชั้นข้อความ แต่ไบต์ข้างในเป็นภาษาไทยเฉพาะกับตัวอ่านที่รู้จักรหัสหน้า ตัวดึงข้อความทั่วไปอ่านมันเป็น Latin-1 และได้อักขระตามด้านล่าง
กรุงเทพ on the page A1 C3 D8 A7 E0 B7 BE in the file (TIS-620) ¡Ãا෾ after extraction
ขยะแบบนี้คงที่และแปลงกลับได้ด้วยตารางสำหรับกรณี TIS-620 แต่ตารางของฟอนต์ส่วนตัวไม่มีให้แปลง หน้ากระดาษที่มองเห็นจึงเป็นสำเนาข้อความที่เชื่อถือได้เพียงชุดเดียว และนั่นคือนิยามของเอกสารสแกน
ไม่มีช่องว่างระหว่างคำ#
ภาษาไทยเขียนคำติดกัน และใช้ช่องว่างสำหรับแบ่งวลีกับประโยค ชั้นข้อความที่ถูกต้องของใบแจ้งหนี้คืน ใบแจ้งหนี้เลขที่ มาเป็นโทเคนเดียว เครื่องมือใดที่ตัดด้วยช่องว่าง จับขอบคำด้วย \b หรือตัดบรรทัดที่ความกว้างคงที่ กำลังทำงานกับวลีที่มันมองเข้าไปข้างในไม่ได้ ข้อความถูก แต่เครื่องมือรอบข้อความผิด
เลขสองระบบอยู่บรรทัดเดียวกัน#
เอกสารไทยใช้เลขไทย (๑ ๒ ๓) กับวันที่ จำนวน และที่อยู่ และใช้เลขอารบิกกับจำนวนเงิน ในตารางเดียวกัน บางครั้งในช่องเดียวกัน วันที่อ่านว่า ๑๕ กรกฎาคม ๒๕๖๙ เป็นพุทธศักราช จำนวน ๔ อยู่เคียงจำนวนเงิน 3,000.00 และมีอักษรละตินแทรกอยู่ด้วย ตั้งแต่เลขที่เอกสารอย่าง INV-2569-0107 ไปจนถึงชื่อสินค้า การดึงข้อความที่แปลงเลขให้เป็นระบบเดียว หรือสมมติว่าแต่ละช่องมีอักษรระบบเดียว เปลี่ยนค่าโดยไม่มีใครรู้
เมื่อไรที่ OCR คือเครื่องมือที่ถูกต้องสำหรับ PDF ภาษาไทย#
| ไฟล์ที่มี | สิ่งที่ควรทำ |
|---|---|
| มีชั้นข้อความ และข้อความที่ดึงออกมาอ่านถูก | ใช้ชั้นข้อความ และเก็บโครงสร้างที่โปรแกรมสร้างไฟล์บันทึกไว้ |
| มีชั้นข้อความ แต่วรรณยุกต์เรียงผิดหรือหาย | ถือว่าหน้านั้นเป็นรูปภาพ แล้วส่ง OCR |
| มีชั้นข้อความ แต่ได้อักษรละตินขยะจากฟอนต์รุ่นเก่า | ถือว่าหน้านั้นเป็นรูปภาพ แล้วส่ง OCR |
| หน้าสแกนหรือถ่ายด้วยกล้อง | OCR |
| แบบฟอร์มพิมพ์ที่มีตราประทับหรือลายมือซ้อน | OCR ทั้งหน้า แล้วเทียบกับชั้นข้อความ |
OCR อ่านหน้ากระดาษแบบเดียวกับที่คนอ่าน คืออ่านจากพิกเซล และไม่สนใจว่าไฟล์เก็บอักขระไว้อย่างไร มันจึงเป็นเครื่องมือที่ถูกต้องสำหรับทุกแถวในตารางยกเว้นแถวแรก และเป็นเครื่องมือเดียวที่คืนส่วนที่เป็นตราประทับ ลายเซ็น และลายมือของหน้าผสมกลับมาได้
OCR เป็นเครื่องมือที่ผิดสำหรับชั้นข้อความที่สะอาดอยู่แล้ว เพราะต้องจ่ายค่ารอบอ่านภาพเพื่อได้ข้อความที่ไฟล์มีอยู่แล้ว ตรวจสองอย่างข้างต้นก่อนเสมอ
OCR เอกสารคืนอะไรกลับมาจากหน้าภาษาไทย#
การรู้จำอักขระคืนสายอักขระหนึ่งเส้น ส่วน OCR เอกสารคืนทั้งหน้า Paxa OCR Lite อ่านทั้งหน้าตามลำดับการอ่าน แล้วคืนเป็น Markdown ที่ยังมีหัวข้อและตารางครบ หรือคืนเป็นบล็อกที่ระบุชนิด (หัวข้อ ย่อหน้า รายการ ตาราง รูป) ให้โค้ดอ่านต่อ บรรทัดด้านล่างคือบรรทัดแรก ๆ ของผลการอ่านใบแจ้งหนี้ตัวอย่างที่บันทึกไว้ในระบบ โดยไม่มีการแก้ไข
# บริษัท ศตวรรษการค้า จำกัด (สำนักงานใหญ่) เลขประจำตัวผู้เสียภาษีอากร 0 1055 64078 12 3 # ใบแจ้งหนี้ เลขที่ INV-2569-0107 วันที่ ๑๕ กรกฎาคม ๒๕๖๙ | ลำดับ | รายละเอียด | จำนวน | หน่วยละ | จำนวนเงิน | | ๑ | ค่าบริการดูแลระบบรายเดือน กรกฎาคม ๒๕๖๙ | ๑ | 18,000.00 | 18,000.00 | | ๒ | ค่าพื้นที่จัดเก็บข้อมูลส่วนเกิน | ๔ | 750.00 | 3,000.00 | ( สามหมื่นหกพันสามร้อยแปดสิบบาทถ้วน )
สามสิ่งในข้อความข้างต้นคือสิ่งที่ทำให้การดึงจากชั้นข้อความพัง รายการสินค้าใช้เลขไทยกับลำดับและจำนวน เคียงเลขอารบิกกับจำนวนเงิน และทั้งคู่กลับมาตามเลขที่พิมพ์ วันที่เป็นพุทธศักราชและกลับมาตามที่พิมพ์ ให้แอปพลิเคชันแปลงเอง ยอดรวมเป็นตัวอักษร สามหมื่นหกพันสามร้อยแปดสิบบาทถ้วน เป็นสายอักษรไทยติดกันหนึ่งเส้น และกลับมาเป็นหนึ่งบรรทัด
เมื่อตั้ง output เป็น structured หน้าเดียวกันจะกลับมาเป็นบล็อกที่ระบุชนิด ชื่อบริษัทเป็นบล็อกหัวข้อระดับหนึ่ง แต่ละบรรทัดป้ายชื่อเป็นบล็อกย่อหน้า และรายการสินค้าเป็นบล็อกตารางหนึ่งบล็อกที่แต่ละแถวเป็นอาร์เรย์ของข้อความในช่อง โค้ดอ่านเลขที่ใบแจ้งหนี้จากข้อความหลังป้ายชื่อ และอ่านรายการจากแถวของบล็อกนั้น โดยไม่ต้องมีเทมเพลตแยกตามผู้ขาย
ตารางกลับมาเป็นตาราง ตัวอ่านที่ไล่หน้ากระดาษเป็นแถบพิกเซลจะบีบห้าคอลัมน์นั้นเป็นบรรทัดเดียวต่อแถว และทำให้ไม่รู้ว่าตัวเลขไหนคือราคาต่อหน่วย ผลการอ่านฉบับเต็มและหน้าตัวอย่างที่ใช้อ่านอยู่ที่หน้าใบแจ้งหนี้
วิธีตรวจผล OCR ภาษาไทย#
ผลการอ่านเป็นไปตามตัวเอกสาร และตัวเอกสารเองอาจผิดในตัวมันเอง การตรวจต่อไปนี้จับปัญหาส่วนใหญ่ในเอกสารธุรกิจไทยได้ก่อนที่ค่าจะไหลเข้าระบบ
- เลขประจำตัวผู้เสียภาษีมี ๑๓ หลัก ตัดช่องว่างออกแล้วนับ
0 1055 64078 12 3ผ่าน - จำนวนเงินแต่ละรายการเท่ากับจำนวนคูณราคาต่อหน่วย และยอดรวม ภาษีมูลค่าเพิ่ม ๗% กับยอดรวมทั้งสิ้นต้องบวกกันลงตัว ผลอ่านที่ขัดกันเองแปลว่าอ่านตัวเลขผิดสักตัว
- ปีที่มากกว่า ๒๕๐๐ คือพุทธศักราช ลบ ๕๔๓ ก่อนบันทึกเป็นวันที่
๒๕๖๙คือ 2026 - จำนวนแถวในตารางต้องเท่ากับจำนวนรายการบนหน้า แถวที่ถูกรวมกันคือความผิดพลาดของตารางที่พบบ่อยที่สุดในใบแจ้งหนี้ที่แน่น
- เลขไทยและเลขอารบิกต้องแปลงเป็นตัวเลขได้ทั้งคู่ แปลงด้วยตารางเสมอ อย่าแปลงด้วยมือ
- จำนวนเงินตัวอักษรต้องตรงกับยอดรวมทั้งสิ้น ช่องนี้คือช่องที่คนเขียนไว้เพื่อจับความผิดพลาดประเภทนี้โดยเฉพาะ
หมายเหตุ
ใบกำกับภาษีคือเอกสารตามกฎหมายที่ประมวลรัษฎากรกำหนดรายการไว้ ส่วนใบแจ้งหนี้คือเอกสารทางการค้า หน้าใบกำกับภาษี แสดงรายการที่กฎหมายกำหนด ซึ่งเป็นรายการที่ผู้ตรวจสอบจะอ่านย้อนกลับ
OCR ภาษาไทยคิดราคาอย่างไร และรับไฟล์แบบไหน#
คิดราคาต่อหน้า หน้าละ 6.5 เครดิต หรือ $7 ต่อพันหน้า และปริมาณข้อความบนหน้าไม่เปลี่ยนราคา บัญชีใหม่เริ่มต้นด้วยเครดิตฟรี 100 เครดิต ซึ่งอ่านได้ 15 หน้า
คำขอหนึ่งครั้งรับ PDF, PNG, JPEG หรือ WebP ขนาดไม่เกิน 10 MB และไม่เกิน 50 หน้า รูปภาพหนึ่งรูปนับเป็นหนึ่งหน้า จำนวนหน้าถูกอ่านจากไฟล์ก่อนตัดเครดิต และ PDF ที่ต้องใช้รหัสผ่านจะถูกปฏิเสธก่อนที่เครดิตจะขยับ
ทีมบัญชีเจ้าหนี้ที่ส่งใบแจ้งหนี้จากผู้ขายทุกใบผ่านขั้นตอนนี้ มีอธิบายไว้ที่หน้าการประมวลผลใบแจ้งหนี้
เริ่มดึงข้อความจาก PDF ภาษาไทยวันนี้#
- ตรวจสองอย่างก่อน ถ้าชั้นข้อความอ่านถูก ใช้ชั้นข้อความ
- วางหน้าที่เพี้ยนหรือหน้าสแกนลงในเพลย์กราวด์ แล้วอ่าน Markdown ที่ได้กลับมา หน้าแรกไม่ต้องเขียนโค้ด
- เลือก
markdownเมื่อคนหรือโมเดลภาษาจะอ่านผลต่อ และเลือกstructuredเมื่อโค้ดจะอ่านต่อ - อ่านคู่มือ OCR สำหรับรูปแบบคำขอ และเอกสารอ้างอิง API สำหรับทุกฟิลด์และรหัสข้อผิดพลาด
- รันรายการตรวจข้างต้นกับเอกสารร้อยใบแรก แล้วเก็บข้อตรวจที่เคยจับปัญหาได้ไว้
- หน้า OCR ภาษาไทย มีผลการอ่านเอกสารเต็มหน้าที่บันทึกไว้ และเอกสารสิบสองประเภทพร้อมผลอ่านตัวอย่าง