ข้ามไปยังเนื้อหา

สร้างเนื้อหาข้อความที่เครื่องมือปลายทางแยกดึงออกมาได้

NextPDF Core เป็น ผู้ผลิต PDF และไม่ได้มาพร้อมตัวอ่านที่แปลง PDF เป็นข้อความแบบสาธารณะ ในบริบทของ Core “การแยกดึงเนื้อหาข้อความ” หมายถึงการสร้างเอกสารให้ข้อความ สามารถแยกดึงออกมาได้ โดยรหัสกลิฟมี /ToUnicode CMap กำกับไว้ และเอกสารมีโครงสร้างเชิงตรรกะแบบ tagged จากนั้นตัวอ่านที่เป็นไปตามข้อกำหนดหรือเครื่องมือแยกดึงปลายทางจะกู้คืนข้อความ Unicode ตามลำดับการอ่านได้

การอ่านข้อความจาก PDF ของบุคคลที่สามใดๆ เป็นงานฝั่งผู้บริโภค ให้ใช้ sidecar ของโมดูล Inspect หรือเครื่องมือภายนอกสำหรับงานดังกล่าว งานนี้ไม่ใช่พื้นผิวฝั่งผู้ผลิตของ Core

Terminal window
composer require nextpdf/core:^3

ตัวดำเนินการแสดงข้อความในสตรีมเนื้อหาวางข้อความลงบนหน้า (ISO 32000-2 §9.4.3) รหัสกลิฟไม่ใช่ Unicode โดยตรง /ToUnicode CMap ช่วยให้ตัวอ่านแมปรหัสเหล่านั้นกลับเป็น Unicode เพื่อการแยกดึง (ISO 32000-2 §9.10.2) ต้นไม้โครงสร้างแบบ tagged บันทึก ลำดับการอ่านเชิงตรรกะ ดังนั้นการแยกดึงจึงกู้คืนข้อความตามลำดับเอกสารแทนลำดับการวาด (ISO 32000-2 §14.8)

enableTaggedPdf() สร้างต้นไม้โครงสร้างนั้นและรักษา /ToUnicode CMap ไว้สำหรับฟอนต์แบบ embedded-subset เมื่อใช้ร่วมกัน ฟีเจอร์เหล่านี้ทำให้ผลลัพธ์แยกดึงออกมาได้อย่างน่าเชื่อถือ

Document::enableTaggedPdf(string $lang = 'en') สร้างต้นไม้โครงสร้างและตั้งค่าโหมดความสอดคล้องที่รักษา /ToUnicode CMap ไว้ Document::setLanguage(string $lang) บันทึกแท็กภาษา BCP-47 เรียกใช้เมท็อดทั้งสองก่อนเขียนเนื้อหา จากนั้นเขียนข้อความผ่านพื้นผิว setFont() / cell() / multiCell() ตามปกติ

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
$doc->setLanguage('en');
$doc->enableTaggedPdf('en'); // structure tree + ToUnicode retention
$doc->addPage();
$doc->setFont('helvetica', '', 12);
$doc->multiCell(0, 7, 'This text is extractable by a downstream reader.');
file_put_contents(__DIR__ . '/extractable.pdf', $doc->getPdfData());

โปรแกรมแบบเบ็ดเสร็จนี้ทำงานในฮาร์เนสและสอดคล้องกับ examples/38-extract-text-content.php โปรแกรมนี้สร้างเอกสารแบบ tagged ที่ข้อความมี /ToUnicode CMap และลำดับการอ่านเชิงตรรกะกำกับไว้ จากนั้นตัวแยกดึงปลายทางจะกู้คืนข้อความ Unicode ตามลำดับได้

<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$paragraphs = [
'NextPDF produces documents whose text content is extractable.',
'A tagged structure tree records the logical reading order.',
'The ToUnicode CMap lets a reader recover Unicode from glyph codes.',
];
$doc = Document::createStandalone();
$doc->setTitle('Extractable text content');
$doc->setAuthor('NextPDF Cookbook');
$doc->setLanguage('en'); // BCP 47; validated on enableTaggedPdf()
// Configure tagged mode BEFORE content so the structure tree captures the
// text in reading order and the /ToUnicode CMap is retained.
$doc->enableTaggedPdf('en');
$doc->addPage();
$doc->setFont('helvetica', '', 12);
foreach ($paragraphs as $p) {
$doc->multiCell(0, 7, $p); // captured in reading order
$doc->ln(2);
}
$pdf = $doc->getPdfData();
// $pdf contains a /StructTreeRoot and per-font /ToUnicode CMaps; an external
// extractor (or the Inspect sidecar) recovers the Unicode text in order.
echo "Wrote a tagged PDF with extractable text content\n";
echo 'Paragraphs authored: ' . count($paragraphs) . "\n";
echo "Text is recoverable via the /ToUnicode CMap + tagged reading order.\n";
// The harness sets NEXTPDF_COOKBOOK_OUTPUT and runs this script under the
// semantic profile; emit the document to the side-channel.
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT');
file_put_contents($out !== false && $out !== '' ? $out : __DIR__ . '/extractable.pdf', $pdf);

STDOUT ที่คาดไว้:

Wrote a tagged PDF with extractable text content
Paragraphs authored: 3
Text is recoverable via the /ToUnicode CMap + tagged reading order.
  • เป็นผู้ผลิต ไม่ใช่ตัวอ่าน Core ไม่มี extractText() แบบสาธารณะ การอ่านข้อความ ออกจาก PDF ของบุคคลที่สามที่มีอยู่แล้วเป็นงานฝั่งผู้บริโภค ให้ใช้โมดูล Inspect ร่วมกับ sidecar ของ Spectrum หรือใช้เครื่องมือแยกดึงภายนอก สูตรนี้ทำให้ผลลัพธ์ ของคุณ แยกดึงออกมาได้
  • กำหนดค่า tagging ก่อน เรียกใช้ enableTaggedPdf() ก่อนเขียนเนื้อหา เพื่อให้ต้นไม้โครงสร้างบันทึกข้อความตามลำดับการอ่าน การเรียกใช้หลังจากเพิ่มเนื้อหาแล้วจะไม่ tag เนื้อหาที่มีอยู่ก่อนหน้า
  • แท็กภาษาไม่ถูกต้อง enableTaggedPdf() ตรวจสอบความถูกต้องของแท็ก BCP-47 และโยน InvalidConfigException เมื่อแท็กไม่ถูกต้อง ให้ใช้แท็กที่ลงทะเบียนไว้ เช่น en, zh-Hant-TW หรือ ja
  • ผลลัพธ์แบบธรรมดา (untagged) หากไม่มี enableTaggedPdf() ผลลัพธ์แบบธรรมดาอาจไม่ใส่ /ToUnicode CMap สำหรับฟอนต์ที่ใช้ CMap แบบกำหนดไว้ล่วงหน้าเพื่อลดขนาด การแยกดึงจึงไม่น่าเชื่อถือสำหรับฟอนต์เหล่านั้น ให้ tag เอกสารเมื่อคุณต้องการข้อความที่แยกดึงออกมาได้

การใช้ tagging เพิ่มต้นไม้โครงสร้างและรักษา /ToUnicode CMap ไว้ ดังนั้นขนาดผลลัพธ์จึงเพิ่มขึ้นเล็กน้อย ต้นทุนแปรผันตามปริมาณเนื้อหาและไม่เปลี่ยนแปลงโมเดลการเรนเดอร์แบบรอบเดียว

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

ข้อความระบุข้อกำหนดข้อรหัสอ้างอิง (reference_id)
ToUnicode CMap แมปรหัสอักขระไปยัง Unicode สำหรับการแยกดึงข้อความISO 32000-2§9.10.2
ตัวดำเนินการแสดงข้อความวางสตริงลงบนหน้าในสตรีมเนื้อหาISO 32000-2§9.4.3
ต้นไม้โครงสร้างแบบ tagged บันทึกลำดับการอ่านเชิงตรรกะสำหรับการแยกดึงISO 32000-2§14.8

สูตรนี้สร้างเนื้อหาข้อความที่แยกดึงออกมาได้ แต่ไม่ได้ยืนยันความสอดคล้องตาม PDF/UA-2 ซึ่งเป็นสิ่งที่เครื่องมือตรวจสอบเป็นผู้กำหนด โปรดดูสูตรด้านการเข้าถึง