Ga naar inhoud

Tekstinhoud maken die downstreamtools kunnen extraheren

NextPDF Core is een PDF-producer. Het bevat geen publieke PDF-naar-tekstlezer. Binnen Core betekent „tekstinhoud extraheren” dat u het document zo opbouwt dat de tekst extraheerbaar is. De glyphs zijn voorzien van een /ToUnicode-CMap en het document heeft een getagde logische structuur. Een conforme lezer of downstream-extractietool kan de Unicode-tekst vervolgens in leesvolgorde reconstrueren.

Tekst uit een willekeurige PDF van derden lezen is werk voor de consumer. Gebruik voor die taak de sidecar van de Inspect-module of een externe tool, niet de producer-API van Core.

Terminal window
composer require nextpdf/core:^3

Tekstweergave-operators in de content stream plaatsen tekst op een pagina (ISO 32000-2 §9.4.3). Glyphcodes zijn geen Unicode. Met een /ToUnicode-CMap kan een lezer die codes voor extractie terugmappen naar Unicode (ISO 32000-2 §9.10.2). Een getagde structuurboom legt de logische leesvolgorde vast, zodat extractie de tekst in documentvolgorde kan reconstrueren in plaats van in tekenvolgorde (ISO 32000-2 §14.8).

enableTaggedPdf() bouwt die structuurboom op en zorgt dat de /ToUnicode-CMap voor lettertypen met een ingesloten subset behouden blijft. Samen maken deze functies de uitvoer betrouwbaar extraheerbaar.

Document::enableTaggedPdf(string $lang = 'en') bouwt de structuurboom op en stelt de conformiteitsmodus in die de /ToUnicode-CMap behoudt. Document::setLanguage(string $lang) legt de BCP 47-taaltag vast. Roep beide methoden aan voordat u inhoud schrijft. Schrijf de tekst daarna met de gebruikelijke setFont()- / cell()- / multiCell()-API.

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

Dit op zichzelf staande programma draait in de harness. Het komt overeen met examples/38-extract-text-content.php. Het maakt een getagd document waarin de tekst aan een /ToUnicode-CMap en een logische leesvolgorde is gekoppeld. Een downstream-extractor kan de Unicode-tekst vervolgens op volgorde reconstrueren.

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

Verwachte STDOUT:

Wrote a tagged PDF with extractable text content
Paragraphs authored: 3
Text is recoverable via the /ToUnicode CMap + tagged reading order.
  • Producer, geen lezer. Core heeft geen publieke extractText(). Tekst uit een bestaande PDF van derden lezen is een taak voor de consumer. Gebruik de Inspect-module met de Spectrum-sidecar of een externe extractietool. Dit recipe maakt uw uitvoer extraheerbaar.
  • Configureer tagging eerst. Roep enableTaggedPdf() aan voordat u inhoud schrijft, zodat de structuurboom de tekst in leesvolgorde vastlegt. Een aanroep nadat inhoud is toegevoegd, tagt de eerdere inhoud niet.
  • Ongeldige taaltag. enableTaggedPdf() valideert de BCP 47-tag en gooit InvalidConfigException wanneer de tag ongeldig is. Gebruik een geregistreerde tag, zoals en, zh-Hant-TW of ja.
  • Platte (ongetagde) uitvoer. Zonder enableTaggedPdf() kan platte uitvoer de /ToUnicode-CMap voor vooraf gedefinieerde CMap-lettertypen onderdrukken om de bestandsgrootte te beperken. Extractie is dan onbetrouwbaar voor die lettertypen. Tag het document wanneer u extraheerbare tekst nodig hebt.

Tagging voegt de structuurboom toe en behoudt /ToUnicode-CMaps, waardoor de uitvoergrootte bescheiden toeneemt. De kosten schalen mee met de hoeveelheid inhoud en veranderen niets aan het single-pass-weergavemodel.

Getagde tekstinhoud is per ontwerp machineleesbaar. Plaats geen geheimen in documenttekst in de verwachting dat ze verborgen blijven. Iedereen met het bestand kan extraheerbare tekst extraheren. Dit is een recipe voor producer-correctheid, geen vertrouwelijkheidsmaatregel. Raadpleeg voor vertrouwelijkheid het versleutelingsrecipe.

BeweringSpecificatieClausulereference_id
Een ToUnicode-CMap mapt tekencodes naar Unicode voor tekstextractie.ISO 32000-2§9.10.2
Tekstweergave-operators plaatsen strings op de pagina in de content stream.ISO 32000-2§9.4.3
Een getagde structuurboom legt de logische leesvolgorde vast voor extractie.ISO 32000-2§14.8

Dit recipe produceert tekstinhoud die extraheerbaar is. Het claimt geen PDF/UA-2-conformiteit; die wordt door een checker bepaald. Raadpleeg het toegankelijkheidsrecipe.