İçeriğe geç

Aşağı akış araçları tarafından çıkarılabilecek metin içeriği üretin

NextPDF Core, bir PDF üreticisidir. Herkese açık bir PDF’den metne okuyucu API’si içermez. Core bağlamında “metin içeriğini çıkarma”, belgeyi metni çıkarılabilir olacak şekilde oluşturmanız anlamına gelir. Glifler bir /ToUnicode CMap taşır ve belge, etiketli bir mantıksal yapıya sahiptir. Bunun ardından uyumlu bir okuyucu veya aşağı akış çıkarma aracı, Unicode metni okuma sırasına göre geri kazanabilir.

Herhangi bir üçüncü taraf PDF’den metin okumak, tüketici işidir. Bu görev için Core’un üretici yüzeyini değil, Inspect modülü yardımcısını veya harici bir aracı kullanın.

Terminal window
composer require nextpdf/core:^3

İçerik akışındaki metin gösterme işleçleri, sayfaya metin yerleştirir (ISO 32000-2 §9.4.3). Glif kodları Unicode değildir. Bir /ToUnicode CMap, okuyucunun bu kodları çıkarma amacıyla yeniden Unicode’a eşlemesine olanak tanır (ISO 32000-2 §9.10.2). Etiketli bir yapı ağacı mantıksal okuma sırasını kaydeder; böylece çıkarma işlemi metni boyama sırası yerine belge sırasına göre geri kazanabilir (ISO 32000-2 §14.8).

enableTaggedPdf() bu yapı ağacını oluşturur ve gömülü alt küme yazı tipleri için /ToUnicode CMap’i korur. Bu özellikler birlikte çıktıyı güvenilir biçimde çıkarılabilir kılar.

Document::enableTaggedPdf(string $lang = 'en') yapı ağacını oluşturur ve /ToUnicode CMap’i koruyan uyumluluk modunu ayarlar. Document::setLanguage(string $lang) BCP-47 dil etiketini kaydeder. Her iki yöntemi de içerik yazmadan önce çağırın. Ardından metni her zamanki setFont() / cell() / multiCell() yüzeyiyle yazın.

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

Bu bağımsız program, test düzeneğinde çalışır. examples/38-extract-text-content.php dosyasını yansıtır. Metnin bir /ToUnicode CMap ve mantıksal okuma sırası taşıdığı etiketli bir belge oluşturur. Ardından aşağı akıştaki bir çıkarıcı, Unicode metni sırayla geri kazanabilir.

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

Beklenen STDOUT:

Wrote a tagged PDF with extractable text content
Paragraphs authored: 3
Text is recoverable via the /ToUnicode CMap + tagged reading order.
  • Üretici, okuyucu değil. Core’da herkese açık bir extractText() yoktur. Mevcut bir üçüncü taraf PDF’nin içinden metin okumak, tüketici görevidir. Inspect modülünü Spectrum yardımcısıyla kullanın veya harici bir çıkarma aracı kullanın. Bu reçete, sizin çıktınızı çıkarılabilir kılar.
  • Önce etiketlemeyi yapılandırın. İçerik yazmadan önce enableTaggedPdf() çağırın; böylece yapı ağacı metni okuma sırasına göre yakalar. İçerik eklendikten sonra yapılan bir çağrı, önceki içeriği etiketlemez.
  • Geçersiz dil etiketi. enableTaggedPdf() BCP-47 etiketini doğrular ve etiket geçersiz olduğunda InvalidConfigException fırlatır. Kayıtlı bir etiket kullanın, örneğin en, zh-Hant-TW veya ja.
  • Düz (etiketsiz) çıktı. enableTaggedPdf() olmadan düz çıktı, boyutu küçültmek için önceden tanımlı CMap yazı tiplerinde /ToUnicode CMap’i bastırabilir. Bu durumda çıkarma işlemi bu yazı tipleri için güvenilir değildir. Çıkarılabilir metne ihtiyaç duyduğunuzda belgeyi etiketleyin.

Etiketleme, yapı ağacını ekler ve /ToUnicode CMap’leri korur; bu nedenle çıktı boyutu sınırlı ölçüde artar. Ek maliyet, içerik hacmiyle ölçeklenir ve tek geçişli işleme modelini değiştirmez.

Etiketli metin içeriği, tasarımı gereği makine tarafından okunabilir. Gizli bilgileri belge metnine yerleştirip gizli kalmalarını beklemeyin. Dosyaya sahip olan herkes çıkarılabilir metni çıkarabilir. Bu, bir gizlilik denetimi değil, üretici doğruluğuna odaklanan bir reçetedir. Gizlilik için şifreleme reçetesine bakın.

İfadeStandartMaddereference_id
Bir ToUnicode CMap, metin çıkarma için karakter kodlarını Unicode’a eşler.ISO 32000-2§9.10.2
Metin gösterme işleçleri, içerik akışında sayfaya dizeler yerleştirir.ISO 32000-2§9.4.3
Etiketli bir yapı ağacı, çıkarma için mantıksal okuma sırasını kaydeder.ISO 32000-2§14.8

Bu reçete, çıkarılabilir metin içeriği üretir. Bir denetleyicinin belirlediği PDF/UA-2 uyumluluğunu ileri sürmez. Erişilebilirlik reçetesine bakın.