Produire du contenu textuel extractible par les outils en aval
En un coup d’œil
Section intitulée « En un coup d’œil »NextPDF Core est un producteur de PDF. Il ne fournit aucun lecteur public PDF-vers-texte. Avec Core, « extraire le contenu textuel » signifie que tu produis le document de manière à ce que son texte soit extractible. Les glyphes sont associés à une CMap /ToUnicode, et le document possède une structure logique balisée. Un lecteur conforme ou un outil d’extraction en aval peut alors récupérer le texte Unicode dans l’ordre de lecture.
Lire le texte depuis un PDF tiers quelconque relève du consommateur. Ce travail revient au sidecar du module Inspect ou à un outil externe, pas à la surface de production de Core.
Installation
Section intitulée « Installation »composer require nextpdf/core:^3Vue d’ensemble conceptuelle
Section intitulée « Vue d’ensemble conceptuelle »Les opérateurs d’affichage de texte du flux de contenu placent le texte sur une page (ISO 32000-2 §9.4.3). Les codes de glyphes ne sont pas de l’Unicode. Une CMap /ToUnicode permet à un lecteur de faire correspondre ces codes à l’Unicode pour l’extraction (ISO 32000-2 §9.10.2). Un arbre de structure balisé enregistre l’ordre de lecture logique, afin que l’extraction récupère le texte dans l’ordre du document plutôt que dans l’ordre de peinture (ISO 32000-2 §14.8).
enableTaggedPdf() construit cet arbre de structure et conserve la CMap /ToUnicode pour les polices incorporées en sous-ensemble. Cette combinaison rend la sortie extractible de façon fiable.
Surface de l’API
Section intitulée « Surface de l’API »Document::enableTaggedPdf(string $lang = 'en') construit l’arbre de structure et active le mode de conformité qui préserve la CMap /ToUnicode. Document::setLanguage(string $lang) enregistre la langue naturelle au format BCP-47. Appelle les deux avant d’écrire du contenu. Écris ensuite le texte avec l’interface habituelle setFont() / cell() / multiCell().
Exemple de code — Démarrage rapide
Section intitulée « Exemple de code — Démarrage rapide »<?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());Exemple de code — Production
Section intitulée « Exemple de code — Production »Voici le programme autonome, exécutable par le harnais. Il correspond à examples/38-extract-text-content.php. Il produit un document balisé dont le texte est associé à une CMap /ToUnicode et à un ordre de lecture logique, puis un extracteur en aval récupère le texte Unicode dans l’ordre.
<?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);Sortie STDOUT attendue :
Wrote a tagged PDF with extractable text contentParagraphs authored: 3Text is recoverable via the /ToUnicode CMap + tagged reading order.Cas limites & pièges
Section intitulée « Cas limites & pièges »- Producteur, pas lecteur. Core n’expose pas de
extractText()public. Lire le texte depuis un PDF tiers existant est une tâche de consommateur. Utilise le module Inspect avec le sidecar Spectrum, ou un outil d’extraction externe. Cette recette rend ta sortie extractible. - Configure d’abord le balisage. Appelle
enableTaggedPdf()avant d’écrire du contenu, pour que l’arbre de structure capture le texte dans l’ordre de lecture. Un appel effectué après l’ajout de contenu ne balise pas le contenu antérieur. - Balise de langue invalide.
enableTaggedPdf()valide la balise BCP-47 et lèveInvalidConfigExceptionsi elle est invalide. Utilise une balise enregistrée, par exempleen,zh-Hant-TW, ouja. - Sortie simple (non balisée). Sans
enableTaggedPdf(), une sortie simple peut retirer la CMap/ToUnicodedes polices à CMap prédéfinie pour réduire la taille. L’extraction devient alors peu fiable pour ces polices. Balise le document quand l’extractibilité compte.
Performances
Section intitulée « Performances »Le balisage ajoute l’arbre de structure et conserve les CMaps /ToUnicode, ce qui augmente modérément la taille de la sortie. Le coût est proportionnel au volume de contenu, sans modifier le modèle de rendu en une seule passe.
Notes de sécurité
Section intitulée « Notes de sécurité »Le contenu textuel balisé est, par conception, lisible par une machine. Ne place pas de secrets dans le texte du document en supposant qu’ils resteront cachés, car un texte extractible l’est par quiconque possède le fichier. C’est une recette de correction côté producteur, pas un contrôle de confidentialité. Pour la confidentialité, consulte la recette sur le chiffrement.
Conformité
Section intitulée « Conformité »| Énoncé | Spécification | Clause | reference_id |
|---|---|---|---|
| Une CMap ToUnicode mappe les codes de caractères vers l’Unicode pour l’extraction de texte. | ISO 32000-2 | §9.10.2 | |
| Les opérateurs d’affichage de texte placent des chaînes sur la page dans le flux de contenu. | ISO 32000-2 | §9.4.3 | |
| Un arbre de structure balisé enregistre l’ordre de lecture logique pour l’extraction. | ISO 32000-2 | §14.8 |
Cette recette produit un contenu textuel extractible. Elle n’affirme pas la conformité PDF/UA-2, qu’un vérificateur doit établir. Consulte la recette sur l’accessibilité.