Bỏ qua để đến nội dung

Tạo nội dung văn bản để các công cụ downstream có thể trích xuất

NextPDF Core là một bên tạo PDF. Nó không cung cấp trình đọc công khai để chuyển PDF sang văn bản. Trong phạm vi Core, “trích xuất nội dung văn bản” có nghĩa là bạn tạo tài liệu sao cho phần văn bản trong đó có thể trích xuất được. Các glyph mang theo một CMap /ToUnicode, còn tài liệu có cấu trúc logic được gắn thẻ. Nhờ đó, một trình đọc tuân thủ hoặc công cụ trích xuất downstream có thể khôi phục văn bản Unicode theo thứ tự đọc.

Việc đọc văn bản từ một PDF bên thứ ba bất kỳ thuộc phần việc của bên sử dụng. Với tác vụ đó, hãy dùng sidecar của module Inspect hoặc một công cụ bên ngoài, thay vì bề mặt tạo PDF của Core.

Terminal window
composer require nextpdf/core:^3

Các toán tử hiển thị văn bản trong luồng nội dung đặt văn bản lên trang (ISO 32000-2 §9.4.3). Mã glyph không phải là Unicode. Một CMap /ToUnicode cho phép trình đọc ánh xạ các mã đó trở lại Unicode để trích xuất (ISO 32000-2 §9.10.2). Một cây cấu trúc được gắn thẻ ghi lại thứ tự đọc hợp lý, nhờ vậy việc trích xuất có thể khôi phục văn bản theo thứ tự của tài liệu thay vì thứ tự vẽ (ISO 32000-2 §14.8).

enableTaggedPdf() xây dựng cây cấu trúc đó và giữ lại CMap /ToUnicode cho các phông chữ nhúng dạng tập con. Khi kết hợp, các tính năng này giúp đầu ra có thể được trích xuất một cách đáng tin cậy.

Document::enableTaggedPdf(string $lang = 'en') xây dựng cây cấu trúc và đặt chế độ tuân thủ để bảo toàn CMap /ToUnicode. Document::setLanguage(string $lang) ghi lại thẻ ngôn ngữ BCP-47. Hãy gọi cả hai phương thức trước khi ghi nội dung. Sau đó, ghi văn bản bằng bề mặt setFont() / cell() / multiCell() thông thường.

<?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());

Chương trình độc lập này chạy trong harness và phản ánh examples/38-extract-text-content.php. Nó tạo một tài liệu được gắn thẻ, trong đó văn bản mang theo một CMap /ToUnicode và có thứ tự đọc hợp lý. Nhờ đó, một trình trích xuất downstream có thể khôi phục văn bản Unicode theo đúng thứ tự.

<?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 dự kiến:

Wrote a tagged PDF with extractable text content
Paragraphs authored: 3
Text is recoverable via the /ToUnicode CMap + tagged reading order.
  • Bên tạo, không phải trình đọc. Core không cung cấp extractText() công khai. Việc đọc văn bản từ một PDF bên thứ ba có sẵn là tác vụ của bên sử dụng. Hãy dùng module Inspect cùng sidecar Spectrum hoặc dùng một công cụ trích xuất bên ngoài. Công thức này giúp đầu ra của bạn có thể trích xuất được.
  • Cấu hình gắn thẻ trước. Hãy gọi enableTaggedPdf() trước khi ghi nội dung, để cây cấu trúc nắm bắt văn bản theo thứ tự đọc. Nếu được gọi sau khi đã thêm nội dung, phương thức này sẽ không gắn thẻ cho phần nội dung đã có trước đó.
  • Thẻ ngôn ngữ không hợp lệ. enableTaggedPdf() xác thực thẻ BCP-47 và ném InvalidConfigException khi thẻ không hợp lệ. Hãy dùng một thẻ đã đăng ký, ví dụ như en, zh-Hant-TW, hoặc ja.
  • Kết quả đầu ra thuần (không gắn thẻ). Khi không có enableTaggedPdf(), kết quả đầu ra thuần có thể lược bỏ CMap /ToUnicode đối với các phông chữ dùng CMap dựng sẵn nhằm giảm dung lượng. Khi đó, việc trích xuất sẽ không đáng tin cậy đối với các phông chữ đó. Hãy gắn thẻ cho tài liệu khi bạn cần văn bản có thể trích xuất được.

Việc gắn thẻ bổ sung cây cấu trúc và giữ lại các CMap /ToUnicode, nên dung lượng đầu ra tăng vừa phải. Chi phí này tăng theo lượng nội dung và không làm thay đổi mô hình kết xuất một lượt.

Nội dung văn bản được gắn thẻ vốn được thiết kế để máy đọc được. Đừng đặt thông tin bí mật trong văn bản tài liệu rồi kỳ vọng thông tin đó vẫn được ẩn. Bất kỳ ai có tệp đều có thể trích xuất phần văn bản có thể trích xuất được. Đây là công thức về tính đúng đắn của bên tạo, không phải biện pháp kiểm soát bảo mật. Về bảo mật, hãy xem công thức mã hóa.

Phát biểuĐặc tảĐiều khoảnreference_id
Một ToUnicode CMap ánh xạ mã ký tự sang Unicode để trích xuất văn bản.ISO 32000-2§9.10.2
Các toán tử hiển thị văn bản đặt các chuỗi lên trang trong luồng nội dung.ISO 32000-2§9.4.3
Một cây cấu trúc được gắn thẻ ghi lại thứ tự đọc hợp lý để trích xuất.ISO 32000-2§14.8

Công thức này tạo ra nội dung văn bản có thể trích xuất được. Nó không khẳng định tài liệu tuân thủ PDF/UA-2; việc đó do trình kiểm tra xác định. Hãy xem công thức về khả năng truy cập.