使用FileOutputStream创建一个UTF-8编码的PDF文件

3

我正在使用JasperReports和DynamicReports编写Java代码,创建一个包含UTF-8字符的PDF格式报告。但是问题是,生成的PDF文件根本不包含UTF-8字符,就像它们被替换成""一样。在使用OutputStream创建UTF-8文件时,有什么需要注意的吗?

    public void toPdf(String path){
        OutputStream outHtml;
        try {
            outHtml = new FileOutputStream(path);

            jasperBuilder.toPdf(outHtml);
        } catch (Exception e1) {
            logger.error("failed to create PDF", e1);
        }
}

这可能值得注意,创建XLS和HTML文件并没有遇到这样的问题。
请注意,在jasperBuilder.toPdf(outHtml);下有许多行代码,我已经跟踪了这些行,并没有在这些行中消除我的UTF-8字符。所以我想问题出在outHtml = new FileOutputStream(path);上。

“UTF-8字符”是什么意思?UTF-8只是一种编码方式 - 它可以对所有Unicode字符进行编码。 - Jon Skeet
报告中的日文或波斯字符正在被删除。 - MoienGK
1
好的。听起来值得看看如何配置jasperBuilder,这与FileOutputStream无关。 - Jon Skeet
由于我正在使用DynamicReports与Jasper一起工作,现在我正在尝试弄清楚DynamicReports的开发人员在他们的库中做了什么。 - MoienGK
2个回答

5

我已经解决了它。这是一个字体和编码问题。只需按照这里的教程操作,但在fonts.xml中将<pdfEncoding>UTF-8</pdfEncoding>更改为<pdfEncoding>Identity-H</pdfEncoding>

<fontFamilies>
  <fontFamily name="FreeUniversal">
    <normal>/home/moien/tahoma.ttf</normal>
    <bold>/home/moien/tahoma.ttf</bold>
    <italic>/home/moien/tahoma.ttf</italic>
    <boldItalic>/home/moien/tahoma.ttf</boldItalic>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
  </fontFamily>
</fontFamilies> 

现在我面临另一个挑战,即使字体URL变得相对!

用Identity-H替换UTF-8可以解决问题,但是具体怎么做呢 :) - digz6666
教程链接已经失效。 - SidMorad
你好,你的链接已经过期无法使用。谢谢。 - mehnet ali

2

FileOutputStream是完全不关心被写入的“东西”的。它只写入字节。如果字符被消除或损坏,那么这是由生成要写入流中的字节的任何内容所引起的。

在这种情况下,我猜测问题出在您在运行此代码之前配置/使用jasperBuilder对象的方式上。


嗯,谢谢回复。我不知道该看哪里。那我猜Jasper的PDF生成器可能是问题的原因。 - MoienGK
@dave - 这是一种可能性。但是(我个人认为)更有可能的问题出在您使用Jasper Reports的方式上。我相信,当正确使用时,Jasper Reports能够处理完整的有效Unicode字符范围。 - Stephen C
我并没有直接涉及Jasper,而是在使用Dynamic Reports来处理Jasper报告生成。http://www.dynamicreports.org/ - MoienGK
@dave - 再次提醒,我期望这样的程序能够处理所有有效的Unicode字符范围。请检查您的使用方式。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接