İçeriğe geç

HTML'den erişilebilir, etiketli bir PDF oluşturma

Bu tarifi, anlamsal HTML’den etiketli bir PDF oluşturmak için kullanın. NextPDF, mantıksal yapı ağacını, katalog dilini ve PDF/UA-2 işaretleyicilerini yazar. Uygunluk kararını bir denetleyici verir. Bu tarif, examples/31-pdfua2-tagged.php dosyasını temel alır.

  • Core’u kurun: composer require nextpdf/core:^3.
  • Doğrulama için bir PDF/UA doğrulayıcısı kullanın; örnekte veraPDF kullanılır.
  1. Belgeyi oluşturun.
  2. Önce enableTaggedPdf() işlevini bir Best Current Practice (BCP) 47 dil etiketiyle çağırın; bu çağrı önce, writeHtml() ise sonra gelmelidir. HTML işlem hattı ayrıştırıcıyı oluştururken etiketli modu algılar ve ardından etiketli içerik yayıcısını bağlar.
  3. Belge meta verilerini (başlık, dil) ayarlayın. setLanguage() işlevini enableTaggedPdf() ile birlikte güvenle çağırabilirsiniz, çünkü bu işlev idempotent’tir.
  4. Anlamsal HTML yazın. Ayrıştırıcı, her blok öğesini bir yapı öğesiyle eşler: h1 öğesini H1 ile, p öğesini P ile, ul/li öğelerini L/LI ile ve table öğesini Table/TR/TD ile eşler.
  5. Kaydedin ve ardından bir PDF/UA denetleyicisiyle doğrulayın.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$doc = Document::createStandalone();
// Step 2 — enable tagged mode BEFORE writeHtml(). The lang argument
// drives the catalog /Lang entry and the structure tree root language.
$doc->enableTaggedPdf(lang: 'en');
// Step 3 — metadata. setLanguage() restates intent; it is idempotent here.
$doc->setTitle('Accessible Report');
$doc->setLanguage('en');
$doc->addPage();
// Step 4 — semantic HTML. Each block element becomes a StructElem; text
// runs are wrapped in BDC/EMC operators with stable MCIDs.
$html = <<<'HTML'
<h1>Quarterly Accessibility Report</h1>
<p>This document opts into tagged PDF so assistive technology can expose
a meaningful reading order.</p>
<h2>Findings</h2>
<ul>
<li>Headings carry semantic roles.</li>
<li>Lists keep their item structure.</li>
</ul>
HTML;
$doc->writeHtml($html);
$doc->save(__DIR__ . '/accessible.pdf');
echo "Wrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdf\n";
Wrote accessible.pdf — validate with: verapdf --flavour ua2 accessible.pdf

Çıktı bir yapı ağacı, /MarkInfo << /Marked true >> ifadesi, katalog /Lang girdisi ve pdfuaid:part XMP işaretleyicisi içerir. Bu öğelerin var olduğunu ve kendi içinde tutarlı kaldığını doğrulamak için denetleyiciyi çalıştırın.

  • Çağrı sırası. enableTaggedPdf() işlevini writeHtml() çağrısından sonra çağırmak, daha önce yazılmış olan içeriği geriye dönük olarak etiketlemez. Önce etiketli modu etkinleştirin.
  • Dil etiketi. Hatalı biçimlendirilmiş bir BCP-47 etiketinin yazma sırasında sessizce atılması yerine API sınırında reddedilmesi için ikinci argüman olarak ConformancePolicy::strictUa2() değerini geçirin.
  • İdempotent yeniden etkinleştirme. enableTaggedPdf() işlevini iki kez çağırırsanız, NextPDF halihazırda doldurduğunuz yapı ağacını yeniden oluşturmadan dili günceller.
  • Elle etiketleme. HTML olmayan içerik için öğeleri beginTag() / endTag() ile sarmalayın. Kapsayıcı türleri (Table, TR, L, LI) işaretli içeriği olmayan gruplama öğelerine dönüşür. Yaprak türleri (P, H1H6, TD) MCID alır.
  • Destek, uygunluk anlamına gelmez. NextPDF, PDF/UA-2’nin gerektirdiği yapısal meta verileri yayar. Ayrıca düşürülmüş eşlik uyarısını da gösterir: üretim onayı için harici oracle doğrulaması çağıran tarafın sorumluluğundadır. Bir dosyanın uygun olduğunu belirtmeden önce bir denetleyici çalıştırın.
İfadeStandartMaddereference_id
Gerçek içerik, mantıksal bir yapı gerektirir.ISO 14289-2§8.2.2
Yapı öğeleri, tanımlı bir iç içe geçme ve okuma sırasını izler.ISO 14289-2§8.2.3

Bu tarif, erişilebilir içerik üretimini destekleyen etiketli yapıyı nasıl oluşturacağınızı gösterir. PDF/UA-2 uygunluk iddiasında bulunmaz; kararı bir denetleyici verir.