我们使用Jaspersoft iReport Designer创建双语PDF输出 - 每个文件都包含英文和法文文本。
出于可访问性原因,我们希望在生成的PDF中使用适当的语言标记每个文本块。请参阅PDF19: Specifying the language for a passage or phrase with the Lang entry in PDF documents了解我们正在尝试做的事情。
由于我们直接向用户发送电子邮件,因此无法手动修改PDF文件。
Jaspersoft是否支持此功能?
没有JasperReports版本<= 6.7.0不支持此功能,Configuration Reference中没有可用属性将Lang
属性设置为单个textElement。
你有2个选择:
在这个答案中,我将向您展示如何修改添加其他标签的原始lib(在字典中添加LANG条目)
example中的PDF19: Specifying the language for a passage or phrase with the Lang entry in PDF documents,使用iText RUPS显示此PDF对象树。
我将假设在我们的输出中添加与特定文本相关的/Lang
就足够了,该特定文本不是pdf的默认语言。注意:如果您需要添加其他条目,技术保持不变,您只需要修改下面的代码示例。
如果在类型文本字段中的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
,因为我们现在实际上正在传递文本对象,但我想保留类似的代码以简化示例
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进行可视化
这是否足够根据PDF19:使用PDF文档中的Lang条目指定段落或短语的语言
验证封闭标签或容器上的/ Lang条目是否正确指定了与周围文本语言不同的段落,短语或单词的语言:
据我所知,是的,但我不是这方面的专家,无论如何,如果你需要添加其他标签,程序是相同的。