Przejdź do głównej zawartości

Generowanie treści tekstowej możliwej do wyodrębnienia na dalszym etapie przepływu

NextPDF Core jest producentem plików PDF. Nie udostępnia publicznego czytnika konwertującego PDF na tekst. W Core „wyodrębnianie treści tekstowej” oznacza tworzenie dokumentu tak, aby jego tekst dało się wyodrębnić. Dla glifów dostępna jest mapa CMap /ToUnicode, a dokument ma otagowaną strukturę logiczną. Zgodny czytnik albo narzędzie do wyodrębniania użyte na dalszym etapie przepływu może wtedy odtworzyć tekst Unicode w kolejności odczytu.

Odczytywanie tekstu z dowolnego pliku PDF innej firmy to praca konsumenta. Do tego zadania użyj komponentu pomocniczego modułu Inspect albo zewnętrznego narzędzia, zamiast interfejsu producenta Core.

Okno terminala
composer require nextpdf/core:^3

Operatory wyświetlania tekstu w strumieniu treści umieszczają tekst na stronie (ISO 32000-2 §9.4.3). Kody glifów nie są kodami Unicode. Mapa CMap /ToUnicode pozwala czytnikowi odwzorować te kody z powrotem na Unicode na potrzeby wyodrębniania (ISO 32000-2 §9.10.2). Otagowane drzewo struktury rejestruje logiczną kolejność odczytu, dzięki czemu proces wyodrębniania może odtworzyć tekst w kolejności dokumentu, a nie w kolejności rysowania (ISO 32000-2 §14.8).

enableTaggedPdf() buduje to drzewo struktury i zachowuje mapę CMap /ToUnicode dla osadzonych podzbiorów czcionek. Razem te funkcje sprawiają, że tekst w wyniku można niezawodnie wyodrębnić.

Document::enableTaggedPdf(string $lang = 'en') buduje drzewo struktury i ustawia tryb zgodności, który zachowuje mapę CMap /ToUnicode. Document::setLanguage(string $lang) rejestruje znacznik języka BCP 47. Wywołaj obie metody przed dodaniem treści. Następnie zapisuj tekst zwykłym interfejsem 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());

Ten samodzielny program działa w środowisku wykonawczym. Odpowiada przykładowi examples/38-extract-text-content.php. Tworzy otagowany dokument, w którym tekst jest powiązany z mapą CMap /ToUnicode oraz logiczną kolejnością odczytu. Narzędzie wyodrębniające na dalszym etapie przepływu może wtedy odtworzyć tekst Unicode w odpowiedniej kolejności.

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

Oczekiwany STDOUT:

Wrote a tagged PDF with extractable text content
Paragraphs authored: 3
Text is recoverable via the /ToUnicode CMap + tagged reading order.
  • Producent, nie czytnik. Core nie ma publicznej metody extractText(). Odczytywanie tekstu z istniejącego pliku PDF innej firmy to zadanie konsumenta. Użyj modułu Inspect z komponentem pomocniczym Spectrum albo zewnętrznego narzędzia do wyodrębniania. Ten przepis sprawia, że wygenerowany wynik jest możliwy do wyodrębnienia.
  • Najpierw skonfiguruj tagowanie. Wywołaj enableTaggedPdf() przed zapisaniem treści, aby drzewo struktury przechwyciło tekst w kolejności odczytu. Wywołanie po dodaniu treści nie otaguje treści dodanej wcześniej.
  • Nieprawidłowy znacznik języka. enableTaggedPdf() weryfikuje znacznik BCP 47 i zgłasza InvalidConfigException, jeśli znacznik jest nieprawidłowy. Użyj zarejestrowanego znacznika, na przykład en, zh-Hant-TW lub ja.
  • Zwykły (nieotagowany) wynik. Bez enableTaggedPdf() zwykły wynik może pomijać mapę CMap /ToUnicode dla czcionek z predefiniowanymi mapami CMap, aby zmniejszyć rozmiar. Wyodrębnianie jest wtedy zawodne dla tych czcionek. Otaguj dokument, gdy potrzebujesz tekstu możliwego do wyodrębnienia.

Tagowanie dodaje drzewo struktury i zachowuje mapy CMap /ToUnicode, dlatego rozmiar wyniku nieznacznie rośnie. Koszt skaluje się z objętością treści i nie zmienia jednoprzebiegowego modelu renderowania.

Otagowana treść tekstowa z założenia nadaje się do odczytu maszynowego. Nie umieszczaj sekretów w tekście dokumentu z oczekiwaniem, że pozostaną ukryte. Każdy, kto ma plik, może wyodrębnić tekst możliwy do wyodrębnienia. To przepis o poprawności po stronie producenta, a nie mechanizm kontroli poufności. Informacje o poufności znajdziesz w przepisie dotyczącym szyfrowania.

StwierdzenieSpecyfikacjaKlauzulareference_id
Mapa CMap ToUnicode odwzorowuje kody znaków na Unicode na potrzeby wyodrębniania tekstu.ISO 32000-2§9.10.2
Operatory wyświetlania tekstu umieszczają ciągi znaków na stronie w strumieniu treści.ISO 32000-2§9.4.3
Otagowane drzewo struktury rejestruje logiczną kolejność odczytu na potrzeby wyodrębniania.ISO 32000-2§14.8

Ten przepis generuje treść tekstową możliwą do wyodrębnienia. Nie potwierdza zgodności z PDF/UA-2; zgodność z PDF/UA-2 ustala narzędzie sprawdzające. Zobacz przepis dotyczący dostępności.