У меня есть четыре примера для вас.
Пример 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:
Странная вещь в структуре состоит в том, что вы смешиваете теги заголовков. Когда вы используете 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();
}
Этот результат выглядит так:
Это выглядит более замысловато, особенно для такого простого примера, но если ваш документ больше, эта дополнительная структура может оказаться полезной.
В своем комментарии я ссылался на 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);
}
Результат будет:
Это очень похоже на первый пример.
Теперь, если мы добавим некоторую дополнительную структуру, подобную этой:
<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>
Мы получаем этот результат (используя тот же код):
Эта структура больше похожа на второй пример.
Я думаю, вы неправильно поняли мой комментарий о HTML. Я использую HTML для моделирования моего кода. Гораздо проще настроить HTML, преобразовать в PDF и посмотреть на получившуюся структуру тегов, чем постоянно изменять мой код Java, компилировать и запускать этот код, а затем смотреть на результат.
Я предлагал вам поэкспериментировать с HTML, даже если вашему приложению не нужен HTML. Экспериментирование с HTML помогает вам принимать решения о структуре.