我们正在使用Jaspersoft iReport Designer创建双语PDF输出-每个文件都包含英语和法语文本。
出于可访问性的原因,我们希望在生成的PDF中用适当的语言标记每个文本块。请参阅PDF19: Specifying the language for a passage or phrase with the Lang entry in PDF documents,了解我们要做什么。
由于我们直接通过电子邮件将其发送给我们的用户,因此无法手动修改PDF文件。
Jaspersoft支持吗?
答案 0 :(得分:2)
没有JasperReports版本<= 6.7.0 不不支持此功能,Configuration Reference中没有可用的属性来将Lang
属性设置为单个textElement。
您有2个选择:
Post用dave Jarvis suggested等iText来详细说明pdf。您可以尝试更改词典或重新创建包含此附加信息的pdf。这些方法相当复杂,由于您需要读取/重新创建pdf,因此运行时间自然会增加。
修改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对象树。
我将假设在我们的输出中添加与非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可视化
根据 PDF19:这是否足够:用PDF文档中的Lang条目指定段落或短语的语言
验证是否通过封闭标签或容器上的/ Lang条目正确指定了与周围文本语言不同的段落,短语或单词的语言:
据我所知,是的,但是我不是这方面的专家,无论如何,如果您需要添加其他标签,则过程是相同的。