Membuat Tagged PDF di Java

Membuat PDF ber-tag berarti menambahkan elemen struktur yang membuat dokumen lebih mudah divalidasi terhadap persyaratan aksesibilitas PDF/UA dan lebih mudah diinterpretasikan oleh teknologi bantuan.

Membuat dokumen PDF ber‑tag sederhana

Gunakan contoh ini ketika Anda membutuhkan PDF ber‑tag minimal dengan judul dan paragraf dalam pohon struktur logis.

  1. Buat PDF baru Document dan dapatkan itu ITaggedContent.
  2. Atur judul dokumen dan bahasa, lalu buat elemen header dan paragraf yang diperlukan.
  3. Tambahkan Structure Elements ke elemen root dan simpan dokumen.
public static void createTaggedPdfDocumentSimple(Path outputFile) {
    try (Document document = new Document()) {
        ITaggedContent taggedContent = document.getTaggedContent();
        StructureElement rootElement = taggedContent.getRootElement();

        taggedContent.setTitle("Tagged Pdf Document");
        taggedContent.setLanguage("en-US");

        HeaderElement mainHeader = taggedContent.createHeaderElement();
        mainHeader.setText("Main Header");

        ParagraphElement paragraphElement = taggedContent.createParagraphElement();
        paragraphElement.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
                + "Aenean nec lectus ac sem faucibus imperdiet. Sed ut erat ac magna ullamcorper hendrerit. "
                + "Cras pellentesque libero semper, gravida magna sed, luctus leo.");

        rootElement.appendChild(mainHeader, true);
        rootElement.appendChild(paragraphElement, true);
        document.save(outputFile.toString());
    }
}

Membuat dokumen PDF ber-tag lanjutan

Contoh ini membangun struktur yang lebih kaya dengan mencampur heading, paragraf, span, kutipan, dan pengaturan layout yang eksplisit.

  1. Buat PDF baru Document dan menginisialisasi metadata konten yang ditandai.
  2. Bangun struktur heading dan paragraf, lalu tambahkan span dan elemen kutipan di dalam paragraf.
  3. Sesuaikan posisi paragraf, tambahkan elemen ke struktur akar, dan simpan dokumen.
public static void createTaggedPdfDocumentAdv(Path outputFile) {
    try (Document document = new Document()) {
        ITaggedContent taggedContent = document.getTaggedContent();
        StructureElement rootElement = taggedContent.getRootElement();

        taggedContent.setTitle("Tagged Pdf Document");
        taggedContent.setLanguage("en-US");

        HeaderElement header1 = taggedContent.createHeaderElement(1);
        header1.setText("Header Level 1");

        ParagraphElement paragraphWithQuotes = taggedContent.createParagraphElement();
        paragraphWithQuotes.getStructureTextState().setFont(FontRepository.findFont("Arial"));

        PositionSettings positionSettings = new PositionSettings();
        positionSettings.setMargin(new MarginInfo(10, 5, 10, 5));
        paragraphWithQuotes.adjustPosition(positionSettings);

        SpanElement spanElement1 = taggedContent.createSpanElement();
        spanElement1.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
                + "Aenean nec lectus ac sem faucibus imperdiet. Sed ut erat ac magna ullamcorper hendrerit. ");

        QuoteElement quoteElement = taggedContent.createQuoteElement();
        quoteElement.setText("Sed vulputate, quam sed lacinia luctus, ipsum nibh fringilla purus.");
        quoteElement.getStructureTextState().setFontStyle(Nullable.of(FontStyles.Bold | FontStyles.Italic));

        SpanElement spanElement2 = taggedContent.createSpanElement();
        spanElement2.setText(" Sed non consectetur elit.");

        paragraphWithQuotes.appendChild(spanElement1, true);
        paragraphWithQuotes.appendChild(quoteElement, true);
        paragraphWithQuotes.appendChild(spanElement2, true);

        rootElement.appendChild(header1, true);
        rootElement.appendChild(paragraphWithQuotes, true);
        document.save(outputFile.toString());
    }
}

Menambahkan gaya teks ke konten bertanda

Gunakan contoh ini ketika konten paragraf ber-tag harus membawa informasi font, warna, dan gaya secara eksplisit.

  1. Buat Tagged PDF baru Document.
  2. Buat elemen paragraf dan konfigurasikan status teks strukturnya.
  3. Atur teks paragraf dan simpan dokumen.
public static void addStyle(Path outputFile) {
    try (Document document = new Document()) {
        ITaggedContent taggedContent = document.getTaggedContent();

        taggedContent.setTitle("Tagged Pdf Document");
        taggedContent.setLanguage("en-US");

        ParagraphElement paragraphElement = taggedContent.createParagraphElement();
        taggedContent.getRootElement().appendChild(paragraphElement, true);

        paragraphElement.getStructureTextState().setFontSize(Nullable.of(18.0f));
        paragraphElement.getStructureTextState().setForegroundColor(Color.getRed());
        paragraphElement.getStructureTextState().setFontStyle(Nullable.of(FontStyles.Italic));
        paragraphElement.setText("Red italic text.");

        document.save(outputFile.toString());
    }
}

Menambahkan elemen struktur gambar

Contoh ini menunjukkan cara membuat gambar berlabel dengan teks alternatif, judul, tag khusus, konten gambar, dan penempatan.

  1. Buat Tagged PDF baru Document.
  2. Buat sebuah FigureElement, atur metadata yang dapat diakses, dan tetapkan gambar.
  3. Sesuaikan posisi gambar dan simpan dokumen.
public static void illustrateStructureElements(Path imageFile, Path outputFile) {
    try (Document document = new Document()) {
        ITaggedContent taggedContent = document.getTaggedContent();

        taggedContent.setTitle("Tagged Pdf Document");
        taggedContent.setLanguage("en-US");

        FigureElement figure1 = taggedContent.createFigureElement();
        taggedContent.getRootElement().appendChild(figure1, true);
        figure1.setAlternativeText("Figure One");
        figure1.setTitle("Image 1");
        figure1.setTag("Fig1");
        figure1.setImage(imageFile.toString(), 300);

        PositionSettings positionSettings = new PositionSettings();
        MarginInfo marginInfo = new MarginInfo();
        marginInfo.setLeft(50);
        marginInfo.setTop(20);
        positionSettings.setMargin(marginInfo);
        figure1.adjustPosition(positionSettings);

        document.save(outputFile.toString());
    }
}

Memvalidasi PDF ber-tag untuk PDF/UA

Gunakan contoh ini ketika Anda perlu memeriksa apakah PDF ber‑tag memenuhi aturan validasi PDF/UA.

  1. Buka PDF sumber Document.
  2. Jalankan validasi terhadap PdfFormat.PDF_UA_1.
  3. Tuliskan log validasi dan cetak hasil validasi.
public static void validateTaggedPdf(Path inputFile, Path logFile) {
    try (Document document = new Document(inputFile.toString())) {
        boolean isValid = document.validate(logFile.toString(), PdfFormat.PDF_UA_1);
        System.out.println("Is Valid: " + isValid);
    }
}

Menyesuaikan posisi elemen struktur

Contoh ini menerapkan pengaturan margin dan perataan eksplisit pada paragraf yang ditandai.

  1. Buat Tagged PDF baru Document.
  2. Tambahkan elemen struktur paragraf dan siapkan PositionSettings.
  3. Terapkan pengaturan posisi ke paragraf dan simpan dokumen.
public static void adjustPosition(Path outputFile) {
    try (Document document = new Document()) {
        ITaggedContent taggedContent = document.getTaggedContent();

        taggedContent.setTitle("Tagged Pdf Document");
        taggedContent.setLanguage("en-US");

        ParagraphElement paragraph = taggedContent.createParagraphElement();
        taggedContent.getRootElement().appendChild(paragraph, true);
        paragraph.setText("Text.");

        PositionSettings positionSettings = new PositionSettings();
        MarginInfo marginInfo = new MarginInfo();
        marginInfo.setLeft(300);
        marginInfo.setTop(20);
        marginInfo.setRight(0);
        marginInfo.setBottom(0);
        positionSettings.setMargin(marginInfo);
        positionSettings.setHorizontalAlignment(HorizontalAlignment.None);
        positionSettings.setVerticalAlignment(VerticalAlignment.None);
        positionSettings.setFirstParagraphInColumn(false);
        positionSettings.setKeptWithNext(false);
        positionSettings.setInNewPage(false);
        positionSettings.setInLineParagraph(false);
        paragraph.adjustPosition(positionSettings);

        document.save(outputFile.toString());
    }
}

Mengonversi PDF yang ada ke PDF/UA dengan penandaan otomatis

Gunakan pendekatan ini ketika PDF yang ada harus dikonversi ke PDF/UA dan ditandai secara otomatis selama konversi.

  1. Buka PDF sumber Document.
  2. Buat PdfFormatConversionOptions dan aktifkan penandaan otomatis.
  3. Jalankan konversi dan simpan dokumen output.
public static void convertToPdfUaWithAutomaticTagging(Path inputFile, Path outputFile, Path logFile) {
    try (Document document = new Document(inputFile.toString())) {
        PdfFormatConversionOptions options = new PdfFormatConversionOptions(
                logFile.toString(), PdfFormat.PDF_UA_1, ConvertErrorAction.Delete);

        AutoTaggingSettings autoTaggingSettings = new AutoTaggingSettings();
        autoTaggingSettings.setEnableAutoTagging(true);
        autoTaggingSettings.setHeadingRecognitionStrategy(HeadingRecognitionStrategy.Auto);
        options.setAutoTaggingSettings(autoTaggingSettings);

        document.convert(options);
        document.save(outputFile.toString());
    }
}

Membuat Tagged PDF dengan form bidang yang dapat diakses

Contoh ini menandai bidang formulir tanda tangan sehingga menjadi bagian dari pohon struktur logis.

  1. Buat PDF baru Document dan tambahkan halaman dengan bidang Form.
  2. Tambahkan FormField ke koleksi formulir dokumen.
  3. Buat elemen struktur Form ber-tag, kaitkan dengan bidang, dan simpan dokumen.
public static void createPdfWithTaggedFormField(Path outputFile) {
    try (Document document = new Document()) {
        Page page = document.getPages().add();
        ITaggedContent taggedContent = document.getTaggedContent();
        StructureElement rootElement = taggedContent.getRootElement();

        SignatureField signatureField = new SignatureField(page, new Rectangle(50, 50, 100, 100, true));
        signatureField.setPartialName("Signature1");
        signatureField.setAlternateName("signature 1");

        Form formFields = document.getForm();
        formFields.add(signatureField);

        FormElement form = taggedContent.createFormElement();
        form.setAlternativeText("form 1");
        form.tag(signatureField);
        rootElement.appendChild(form, true);

        document.save(outputFile.toString());
    }
}

Membuat PDF ber-tag dengan halaman TOC

Gunakan contoh ini ketika PDF ber‑tag perlu menyertakan halaman daftar isi dasar yang ditautkan ke heading dokumen.

  1. Buat Tagged PDF baru Document dan tambahkan halaman TOC.
  2. Buat TOCElement dan sebuah header yang seharusnya muncul di TOC.
  3. Tautkan entri TOC ke judul dan simpan dokumen.
public static void createPdfWithTocPage(Path outputFile) {
    try (Document document = new Document()) {
        ITaggedContent content = document.getTaggedContent();
        StructureElement rootElement = content.getRootElement();
        content.setLanguage("en-US");

        Page tocPage = document.getPages().add();
        tocPage.setTocInfo(new TocInfo());

        TOCElement tocElement = content.createTOCElement();
        rootElement.appendChild(tocElement, true);

        document.getPages().add();

        HeaderElement header = content.createHeaderElement(1);
        header.setText("1. Header");
        rootElement.appendChild(header, true);

        TOCIElement toci = content.createTOCIElement();
        tocElement.appendChild(toci, true);
        header.addEntryToTocPage(tocPage, toci);
        toci.addRef(header);

        document.save(outputFile.toString());
    }
}

Membuat PDF bertanda lanjutan dengan halaman TOC

Contoh ini membangun TOC ber‑tag yang lebih kompleks dengan judul halaman yang ditautkan, item daftar bersarang, dan beberapa tingkat heading.

  1. Buat Tagged PDF baru Document dan siapkan halaman TOC dengan judul yang terlihat.
  2. Buat struktur TOC, tautkan judul dan entri TOC ke heading dan item daftar, dan tambahkan elemen konten terkait.
  3. Simpan dokumen akhir dengan struktur TOC lanjutan.
public static void createPdfWithTocPageAdvanced(Path outputFile) {
    try (Document document = new Document()) {
        ITaggedContent content = document.getTaggedContent();
        StructureElement rootElement = content.getRootElement();
        content.setLanguage("en-US");

        Page tocPage = document.getPages().add();
        tocPage.setTocInfo(new TocInfo());
        tocPage.getTocInfo().setTitle(new TextFragment("Table of Contents"));

        TOCElement tocElement = content.createTOCElement();
        HeaderElement headerForTocPageTitle = content.createHeaderElement(1);
        tocElement.linkTocPageTitleToHeaderElement(tocPage, headerForTocPageTitle);

        rootElement.appendChild(headerForTocPageTitle, true);
        rootElement.appendChild(tocElement, true);

        document.getPages().add();

        HeaderElement header = content.createHeaderElement(1);
        header.setText("1. Header");
        rootElement.appendChild(header, true);

        TOCIElement toci = content.createTOCIElement();
        tocElement.appendChild(toci, true);
        header.addEntryToTocPage(tocPage, toci);
        toci.addRef(header);

        ListElement listElement = content.createListElement();
        for (int i = 1; i < 4; i++) {
            ListLIElement li = content.createListLIElement();
            listElement.appendChild(li, true);

            HeaderElement subHeader = content.createHeaderElement(2);
            subHeader.getStructureTextState().setFontSize(Nullable.of(14.0f));
            subHeader.setLanguage("en-US");
            subHeader.setText("1." + i + " subheader ");
            subHeader.addEntryToTocPage(tocPage, li);
            li.addRef(subHeader);

            ParagraphElement p = content.createParagraphElement();
            p.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
            p.setLanguage("en-US");

            rootElement.appendChild(subHeader, true);
            rootElement.appendChild(p, true);
        }
        toci.appendChild(listElement, true);

        HeaderElement header2 = content.createHeaderElement(1);
        header2.setText("2. Header");
        rootElement.appendChild(header2, true);

        TOCIElement toci2 = content.createTOCIElement();
        tocElement.appendChild(toci2, true);
        header2.addEntryToTocPage(tocPage, toci2);
        toci2.addRef(header2);

        document.save(outputFile.toString());
    }
}