Zum Inhalt springen

Extrahierbaren Textinhalt für nachgelagerte Tools erzeugen

NextPDF Core ist ein PDF-Producer. Es liefert keinen öffentlichen PDF-zu-Text-Reader mit. Im Core-Kontext bedeutet „Textinhalt extrahieren“, dass Sie das Dokument so erstellen, dass sein Text extrahierbar ist. Die Glyphen sind mit einer /ToUnicode-CMap versehen, und das Dokument besitzt eine getaggte logische Struktur. Ein konformer Reader oder ein nachgelagertes Extraktions-Tool kann den Unicode-Text dann in Lesereihenfolge wiederherstellen.

Das Auslesen von Text aus einem beliebigen Drittanbieter-PDF ist eine Consumer-Angelegenheit. Diese Arbeit gehört zum Sidecar des Inspect-Moduls oder zu einem externen Tool, nicht zur Producer-Oberfläche von Core.

Terminal-Fenster
composer require nextpdf/core:^3

Text-Showing-Operatoren im Content-Stream platzieren Text auf einer Seite (ISO 32000-2 §9.4.3). Glyph-Codes entsprechen nicht Unicode. Eine /ToUnicode-CMap ermöglicht es einem Reader, diese Codes für die Extraktion wieder auf Unicode abzubilden (ISO 32000-2 §9.10.2). Ein getaggter Strukturbaum hält die logische Lesereihenfolge fest, sodass die Extraktion den Text in Dokumentreihenfolge statt in Zeichenreihenfolge wiederherstellt (ISO 32000-2 §14.8).

enableTaggedPdf() baut diesen Strukturbaum auf und erhält die /ToUnicode-CMap für Embedded-Subset-Fonts. Diese Kombination sorgt dafür, dass die Ausgabe zuverlässig extrahierbar ist.

Document::enableTaggedPdf(string $lang = 'en') baut den Strukturbaum auf und setzt den Konformanzmodus, der die /ToUnicode-CMap erhält. Document::setLanguage(string $lang) legt die natürliche Sprache nach BCP-47 fest. Rufen Sie beide Methoden auf, bevor Sie Inhalt schreiben. Schreiben Sie den Text anschließend mit der üblichen setFont() / cell() / multiCell()-Oberfläche.

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

Dies ist das eigenständige, im Harness ausführbare Programm. Es spiegelt examples/38-extract-text-content.php wider. Es erstellt ein getaggtes Dokument, dessen Text über eine /ToUnicode-CMap und eine logische Lesereihenfolge verfügt; ein nachgelagerter Extractor stellt den Unicode-Text anschließend der Reihe nach wieder her.

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

Erwartete STDOUT-Ausgabe:

Wrote a tagged PDF with extractable text content
Paragraphs authored: 3
Text is recoverable via the /ToUnicode CMap + tagged reading order.
  • Producer, kein Reader. Core hat kein öffentliches extractText(). Text aus einem bestehenden Drittanbieter-PDF auszulesen, ist eine Consumer-Aufgabe. Verwenden Sie das Inspect-Modul mit dem Spectrum-Sidecar oder ein externes Extraktions-Tool. Dieses Recipe macht Ihre Ausgabe extrahierbar.
  • Tagging zuerst konfigurieren. Rufen Sie enableTaggedPdf() auf, bevor Sie Inhalt schreiben, damit der Strukturbaum den Text in Lesereihenfolge erfasst. Ein Aufruf, der nach dem Hinzufügen von Inhalt erfolgt, taggt den vorherigen Inhalt nicht.
  • Ungültiges Sprach-Tag. enableTaggedPdf() validiert das BCP-47-Tag und wirft bei einem ungültigen Tag InvalidConfigException. Verwenden Sie ein registriertes Tag, zum Beispiel en, zh-Hant-TW oder ja.
  • Einfache (ungetaggte) Ausgabe. Ohne enableTaggedPdf() kann eine einfache Ausgabe die /ToUnicode-CMap für Fonts mit vordefinierter CMap unterdrücken, um die Größe zu reduzieren. Die Extraktion ist dann für diese Fonts unzuverlässig. Taggen Sie das Dokument, wenn Extrahierbarkeit wichtig ist.

Tagging fügt den Strukturbaum hinzu und erhält /ToUnicode-CMaps, was die Ausgabegröße geringfügig erhöht. Die Kosten sind proportional zum Inhaltsvolumen und ändern das Single-Pass-Rendering-Modell nicht.

Getaggter Textinhalt ist konzeptbedingt maschinenlesbar. Platzieren Sie keine vertraulichen Informationen im Dokumenttext in der Erwartung, dass sie verborgen bleiben, denn extrahierbarer Text ist für jeden extrahierbar, der über die Datei verfügt. Dies ist ein Recipe für Producer-Korrektheit, keine Vertraulichkeitsmaßnahme. Für Vertraulichkeit siehe das Verschlüsselungs-Recipe.

AussageSpezifikationAbschnittreference_id
Eine ToUnicode-CMap bildet Zeichencodes für die Textextraktion auf Unicode ab.ISO 32000-2§9.10.2
Text-Showing-Operatoren platzieren Strings im Content-Stream auf der Seite.ISO 32000-2§9.4.3
Ein getaggter Strukturbaum hält die logische Lesereihenfolge für die Extraktion fest.ISO 32000-2§14.8

Dieses Recipe erzeugt extrahierbaren Textinhalt. Es behauptet keine PDF/UA-2-Konformanz, denn diese Feststellung trifft ein Checker. Siehe das Accessibility-Recipe.