Я только что попробовал это:
PdfDictionary attr = new PdfDictionary();
attr.put(new PdfName("Summary"), new PdfString("Info about the table"));
table.getAccessibilityProperties().addAttributes(new PdfStructureAttributes(attr));
Это, кажется, делает трюк. Теперь вам нужно адаптировать работника тегов, чтобы этот код выполнялся при обнаружении тега table
.
Обновление 1:
Я взял следующий HTML-файл:
<body>
<table summary="some keys and values">
<thead>
<tr><th scope="col">KEY</th><th scope="col">VALUE</th></tr>
</thead>
<tbody>
<tr><td>Color</td><td>Blue</td></tr>
<tr><td>Shape</td><td>Rectangle</td></tr>
<tr><td>Description</td><td>Blue rectangle</td></tr>
</tbody>
</table>
</body>
Я преобразовал его в доступный документ PDF, например:
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessible tables");
ConverterProperties properties = new ConverterProperties();
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
При проверке результата с помощью PAC3 я получаю следующий результат:
Пока все хорошо, PDF считается доступным PDF / UA-файлом с технической точки зрения.
Затем я проверил "человеческий" тест: присутствует ли сводка таблиц? К сожалению, это не так, поэтому я посмотрел код дополнения pdfHTML и не нашел ссылки на атрибут summary
тега table
. Я думаю, что это было забыто, когда был реализован pdfHTML.
Вначале я напишу пользовательский тэг работника, который позаботится о добавлении сводки. Как только это будет сделано, я попрошу iText Group реализовать атрибут summary
, чтобы он был добавлен в один из следующих выпусков.
Обновление 2:
Я адаптировал мой пример так:
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessible tables");
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new AdaptedTagWorkerFactory());
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
class AdaptedTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if(tag.name().equals("table")){
return new TableWithSummaryTagWorker(tag, context);
}
return null;
}
}
class TableWithSummaryTagWorker extends TableTagWorker {
private String summary = null;
public TableWithSummaryTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
summary = element.getAttribute("summary");
if (summary != null) {
Table table = (Table) super.getElementResult();
PdfDictionary attr = new PdfDictionary();
attr.put(new PdfName("Summary"), new PdfString(summary));
table.getAccessibilityProperties().addAttributes(new PdfStructureAttributes(attr));
}
}
}
Я запускал его через PAC3, и он все еще проверяется как PDF / UA, но нигде не упоминается сводка таблиц. Когда я смотрю в PDF, я вижу сводку:
Теперь я поделюсь этой информацией с iText Group и попрошу их проверить правильность моего решения (пожалуйста, добавьте комментарий, если это не решило вашу проблему). Если это произойдет, есть большая вероятность, что это будет реализовано, начиная с iText 7.1.4.
Обновление 3:
Я адаптировал свой код на основе ответа, предоставленного ФП. В коде ОП была одна ошибка. В этом коде /Summary
добавляется как имя PDF, тогда как это должна быть строка PDF.
public void createPdf(String src, String dest) throws IOException {
PdfWriter writer = new PdfWriter(dest,
new WriterProperties().addUAXmpMetadata());
PdfDocument pdf = new PdfDocument(writer);
pdf.setTagged();
pdf.getCatalog().setLang(new PdfString("en-US"));
pdf.getCatalog().setViewerPreferences(
new PdfViewerPreferences().setDisplayDocTitle(true));
PdfDocumentInfo info = pdf.getDocumentInfo();
info.setTitle("iText7 accessibility example");
ConverterProperties properties = new ConverterProperties();
properties.setTagWorkerFactory(new AdaptedTagWorkerFactory());
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
properties.setFontProvider(fontProvider);
HtmlConverter.convertToPdf(new FileInputStream(src), pdf, properties);
}
class AdaptedTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if(tag.name().equals("table")){
return new TableWithSummaryTagWorker(tag, context);
}
return null;
}
}
class TableWithSummaryTagWorker extends TableTagWorker {
private String summary = null;
public TableWithSummaryTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
super.processEnd(element, context);
IPropertyContainer elementResult = super.getElementResult();
summary = element.getAttribute("summary");
if (summary != null && elementResult instanceof IAccessibleElement) {
AccessibilityProperties properties = ((IAccessibleElement)elementResult).getAccessibilityProperties();
properties.addAttributes(new PdfStructureAttributes("Table").addTextAttribute("Summary", summary));
}
}
}
Теперь, когда вы проверяете результат, вы получаете этот отчет:
Как видите, тест Сводка проходит.