Пометка с помощью itext7 - PullRequest
0 голосов
/ 05 июля 2018

Я работал над тегами для доступности с iText7, и я хочу определенную структуру для тегов. Я вижу, что у itext7 есть библиотечные методы, но я не смог найти применение нигде на сайте itext или на любом другом форуме разработчиков. Я хочу, чтобы структура была такой.

enter image description here

Я вижу класс TagTreePointer и вспомогательные методы, которые используются для тегирования, но не знают, как его реализовать.

Я пробовал пример кода для достижения вышеуказанной функциональности, но обнаружил некоторое несоответствие.

Document document = new Document(pdf);
        pdf.setTagged();
        pdf.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
        pdf.getCatalog().setLang(new PdfString("en-US"));
        PdfDocumentInfo info = pdf.getDocumentInfo();
        info.setTitle("English pangram");
        Paragraph p = new Paragraph("Tested");
        p.getAccessibilityProperties().setRole("H");
        Paragraph p2 = new Paragraph("Child H1");
        p2.getAccessibilityProperties().setRole("H1");
        document.add(p.add(p2.add(new Paragraph("Testing ChildChild"))));
        document.close();

Я добавляю абзац в заголовок абзаца, я вижу, что добавленные абзацы добавляются друг к другу. Как правильно его использовать?

1 Ответ

0 голосов
/ 06 июля 2018

У меня есть четыре примера для вас.

Пример 1 является простым:

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.setTagged();
    pdf.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
    pdf.getCatalog().setLang(new PdfString("en-US"));
    PdfDocumentInfo info = pdf.getDocumentInfo();
    info.setTitle("Testing tags");
    Document document = new Document(pdf);
    Paragraph p = new Paragraph("Tested");
    p.getAccessibilityProperties().setRole("H");
    Paragraph p2 = new Paragraph("Child H1");
    p2.getAccessibilityProperties().setRole("H1");
    document.add(p).add(p2).add(new Paragraph("Testing ChildChild"));
    document.close();
}

Это приводит к следующему PDF:

enter image description here

Странная вещь в структуре состоит в том, что вы смешиваете теги заголовков. Когда вы используете H, я не ожидаю, что вы будете использовать H1. Я ожидаю, что вы будете использовать H и только один уровень заголовков . Если вам нужно больше уровней , я ожидаю, что вы будете использовать H1, H2, ...

Вы также заметили, что ваш комментарий не выдерживает проверки реальностью. Вы написали:

Я изменил код с помощью document.add (p) .add (p2) .add (новый абзац («Тестирование ChildChild»)); и я вижу, что новые абзацы, которые я добавляю, не отображаются в новой строке. Я хочу, чтобы каждый абзац был в новой строке.

Однако, если вы посмотрите на снимок экрана, вы ясно увидите, что каждый абзац начинается с новой строки. Пожалуйста, избегайте публикации комментариев, которые могут быть легко доказаны как ложные. Это может привести к тому, что люди будут вам помогать.

Если вам нужно больше структурных слоев, вы можете ввести Div:

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.setTagged();
    pdf.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true));
    pdf.getCatalog().setLang(new PdfString("en-US"));
    PdfDocumentInfo info = pdf.getDocumentInfo();
    info.setTitle("Testing tags");
    Document document = new Document(pdf);
    Paragraph p = new Paragraph("Tested");
    p.getAccessibilityProperties().setRole("H");
    Div divH = new Div().add(p);
    Paragraph p2 = new Paragraph("Child H1");
    p2.getAccessibilityProperties().setRole("H1");
    Div divH1 = new Div().add(p2);
    divH1.add(new Paragraph("Testing ChildChild"));
    divH.add(divH1);
    document.add(divH);
    document.close();
}

Этот результат выглядит так:

enter image description here

Это выглядит более замысловато, особенно для такого простого примера, но если ваш документ больше, эта дополнительная структура может оказаться полезной.

В своем комментарии я ссылался на HTML, потому что тегирование в PDF имитирует тегирование в HTML. Когда iText был переписан с нуля, он был переписан с учетом HTML.

Я знаю, что вы написали:

Мы не создаем теги HTML. Вместо этого мы получаем данные из БД и вставляем их в абзацы.

Я думаю, что вы пропустили мою мысль там. Я просто хотел объяснить, что независимо от того, как вы создали PDF-файл с тегами, всегда полезно помнить, как контент может быть тегирован в HTML.

Взять, к примеру:

<h1>Introduction</h1>
<h2>TOC</h2>
<p>List</p>
<h1>Appendix</h1>
<h2>Heading</h2>
<p>Description</p>

Теперь запустите этот код:

 */
public void createPdf(String baseUri, String src, String dest) throws IOException {
    PdfWriter writer = new PdfWriter(dest);
    PdfDocument pdf = new PdfDocument(writer);
    pdf.setTagged();
    HtmlConverter.convertToPdf(new FileInputStream(src), pdf);
}

Результат будет:

enter image description here

Это очень похоже на первый пример.

Теперь, если мы добавим некоторую дополнительную структуру, подобную этой:

<div>
    <h1>Introduction</h1>
    <div>
        <h2>TOC</h2>
        <p>List</p>
    </div>
</div>
<div>
    <h1>Appendix</h1>
    <div>
        <h2>Heading</h2>
        <p>Description</p>
    </div>
</div>

Мы получаем этот результат (используя тот же код):

enter image description here

Эта структура больше похожа на второй пример.

Я думаю, вы неправильно поняли мой комментарий о HTML. Я использую HTML для моделирования моего кода. Гораздо проще настроить HTML, преобразовать в PDF и посмотреть на получившуюся структуру тегов, чем постоянно изменять мой код Java, компилировать и запускать этот код, а затем смотреть на результат.

Я предлагал вам поэкспериментировать с HTML, даже если вашему приложению не нужен HTML. Экспериментирование с HTML помогает вам принимать решения о структуре.

...