Сводка таблицы iText7 - PullRequest
       13

Сводка таблицы iText7

0 голосов
/ 29 августа 2018

Я добавил таблицу в PDF, используя дополнение iText7 и pdfHTML. Чтобы установить доступность таблицы, я хочу установить сводку таблицы. Я нашел тот же вопрос ниже. Но нет четкого ответа на это. Как я могу установить сводку таблицы. Пожалуйста, совет.

iText7 508 Сводная таблица

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Спасибо, Бруно. Я использовал C #. И ProcessEnd метод должен быть изменен, как показано ниже.

public override void ProcessEnd(IElementNode element, ProcessorContext context)
    {
    base.ProcessEnd(element, context);
    IPropertyContainer elementResult = base.GetElementResult();
    if (elementResult is IAccessibleElement)
    {
    string summary= element.GetAttribute("summary"); //This is the summary="tbl summary" in HTML
    AccessibilityProperties properties = ((IAccessibleElement)elementResult).GetAccessibilityProperties();
    properties.AddAttributes(new PdfStructureAttributes("Table").AddEnumAttribute("Summary", summary));
    }
    }

Чтобы увидеть названия таблиц, вам нужно открыть PDF-файл с помощью Adobe Acrobat Professional. Щелкните правой кнопкой мыши по таблице и выберите «Редактировать сводку таблицы». Название будет отображаться здесь.

0 голосов
/ 29 августа 2018

Я только что попробовал это:

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 я получаю следующий результат:

enter image description here

Пока все хорошо, 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, я вижу сводку:

enter image description here

Теперь я поделюсь этой информацией с 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));
        }
    }
}

Теперь, когда вы проверяете результат, вы получаете этот отчет:

enter image description here

Как видите, тест Сводка проходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...