如何从Jaspersoft / JRXML生成双语标记的PDF输出?

时间:2018-07-09 20:33:51

标签: jasper-reports multilingual export-to-pdf tagged-pdf

我们正在使用Jaspersoft iReport Designer创建双语PDF输出-每个文件都包含英语和法语文本。

出于可访问性的原因,我们希望在生成的PDF中用适当的语言标记每个文本块。请参阅PDF19: Specifying the language for a passage or phrase with the Lang entry in PDF documents,了解我们要做什么。

由于我们直接通过电子邮件将其发送给我们的用户,因此无法手动修改PDF文件。

Jaspersoft支持吗?

1 个答案:

答案 0 :(得分:2)

没有JasperReports版本<= 6.7.0 不支持此功能,Configuration Reference中没有可用的属性来将Lang属性设置为单个textElement。

您有2个选择:

  1. Post用dave Jarvis suggested等iText来详细说明pdf。您可以尝试更改词典或重新创建包含此附加信息的pdf。这些方法相当复杂,由于您需要读取/重新创建pdf,因此运行时间自然会增加。

  2. 修改JasperReport的source code以添加支持。直接修改JRPdfExporter,JRPdfExporterTagHelper或添加新的导出器(以保持原始库完整)

在这个答案中,我将向您展示如何修改原始lib并添加其他标签(在字典中添加LANG条目)

背景

example中的PDF19: Specifying the language for a passage or phrase with the Lang entry in PDF documents使用iText RUPS显示此PDF对象树。

example1

我将假设在我们的输出中添加与非pdf默认语言的特定文本相关的/Lang就足够了。注意:如果还需要添加其他条目,则该技术保持不变,只需要修改以下代码示例即可。

源代码修改

  

添加一个新属性net.sf.jasperreports.export.pdf.tag.lang,如果这   出现在reportElement上的类型文本字段中,添加一个/Lang条目   其值可用于字典。

修改为JRPdfExporterTagHelper.java

添加静态属性标识符以遵循代码样式

public static final String PROPERTY_TAG_LANG = JRPdfExporter.PDF_EXPORTER_PROPERTIES_PREFIX + "tag.lang";

修改startText(boolean isHyperLink)startText(String text, boolean isHyperlink) ,此示例仅显示第一个方法(第二个原理相同),我们需要更改方法签名并添加{{1} },以便我们可以检索属性。

JRPrintText

由于我们更改了方法签名,我们现在需要修改JRPdfExporter.java,以便我们可以重新编译

修改exportText(JRPrintText text)

protected void startText(JRPrintText text, boolean isHyperlink)
    {
        if (isTagged)
        {

            PdfStructureElement textTag = new PdfStructureElement(tagStack.peek(), isHyperlink ? PdfName.LINK : PdfName.TEXT);
            if (text.hasProperties()&&text.getPropertiesMap().containsProperty(PROPERTY_TAG_LANG)){
                textTag.put(PdfName.LANG, new PdfString(text.getPropertiesMap().getProperty(PROPERTY_TAG_LANG)));
            }
            pdfContentByte.beginMarkedContentSequence(textTag);
        }
    }

您可以删除布尔值... if (glyphRendererAddActualText && textRenderer instanceof PdfGlyphRenderer) { tagHelper.startText(text,styledText.getText(), text.getLinkType() != null); } else { tagHelper.startText(text,text.getLinkType() != null); } ... ,因为我们现在实际上正在传递文本对象,但是为了简化示例,我想保留类似的代码

示例

jrxml

text.getLinkType() != null

导出为带有上述修改的pdf,并使用iText RUPS可视化

Final output

根据 PDF19:这是否足够:用PDF文档中的Lang条目指定段落或短语的语言

  

验证是否通过封闭标签或容器上的/ Lang条目正确指定了与周围文本语言不同的段落,短语或单词的语言:

据我所知,是的,但是我不是这方面的专家,无论如何,如果您需要添加其他标签,则过程是相同的。