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

问题描述 投票:2回答:1

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

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

由于我们直接向用户发送电子邮件,因此无法手动修改PDF文件。

Jaspersoft是否支持此功能?

jasper-reports multilingual export-to-pdf tagged-pdf
1个回答
2
投票

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

你有2个选择:

  1. Post详细说明了pdf,例如iText作为Dave Jarvis suggested。您可以尝试更改字典或重新创建添加此附加信息的pdf。这些方法都相当复杂,自然运行时间会增加,因为您需要读取/重新创建pdf。
  2. 修改JasperReport的source code以添加支持。直接修改JRPdfExporter,JRPdfExporterTagHelper或添加新的导出器(以保持原始库完好无损)

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

Background

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

example1

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

Source code modification

如果在类型文本字段中的reportElement上存在,则添加新属性net.sf.jasperreports.export.pdf.tag.lang/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),这个例子中只显示第一种方法(第二种方法是相同的),我们需要更改添加JRPrintText的方法签名,以便我们可以检索属性。

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);
        }
    }

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

修改exportText(JRPrintText text)

...
if (glyphRendererAddActualText && textRenderer instanceof PdfGlyphRenderer)
{
    tagHelper.startText(text,styledText.getText(), text.getLinkType() != null);
}
else
{
    tagHelper.startText(text,text.getLinkType() != null);
}
...

您可以删除布尔值text.getLinkType() != null,因为我们现在实际上正在传递文本对象,但我想保留类似的代码以简化示例

Example

Jrkasml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="TaggedPdf" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="1be2df3d-cbc1-467c-8729-1ed569eb8a0d">
    <property name="net.sf.jasperreports.export.pdf.tagged" value="true"/>
    <property name="net.sf.jasperreports.export.pdf.tag.language" value="EN-US"/>
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="67" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="240" height="30" uuid="0722eadc-3fd6-4c4d-811c-64fbd18e0af5"/>
                <textElement verticalAlignment="Middle"/>
                <text><![CDATA[Hello world]]></text>
            </staticText>
            <staticText>
                <reportElement x="0" y="30" width="240" height="30" uuid="5080190e-e9fd-4df6-b0f6-f1be3c109805">
                    <property name="net.sf.jasperreports.export.pdf.tag.lang" value="FR"/>
                </reportElement>
                <textElement verticalAlignment="Middle"/>
                <text><![CDATA[Bonjour monde]]></text>
            </staticText>
        </band>
    </title>
</jasperReport>

导出为pdf并进行上述修改,并使用iText RUPS进行可视化

Final output

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.