Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jasper报告PDF中的字符编码_Java_Jasper Reports_Itext - Fatal编程技术网

Java Jasper报告PDF中的字符编码

Java Jasper报告PDF中的字符编码,java,jasper-reports,itext,Java,Jasper Reports,Itext,我试图在jasper报告中使用自定义字体Myanmar3是缅甸的标准字体。 一切正常,但ReportTitle必须是Myanmar3缅甸字体。 Google对缅甸地区也使用Myanmar3 将报告导出为html文件时。它可以显示报告标题。但是,导出的PDF文件不能错误显示 在浏览器中 PDF格式 public void report() throws Exception { List<SalesReport> saleReports = salesReportService

我试图在jasper报告中使用自定义字体
Myanmar3
是缅甸的标准字体。 一切正常,但
ReportTitle
必须是
Myanmar3
缅甸字体。
Google
对缅甸地区也使用
Myanmar3

将报告导出为
html
文件时。它可以显示报告标题。但是,导出的
PDF
文件不能错误显示

在浏览器中

PDF格式

public void report() throws Exception {
    List<SalesReport> saleReports = salesReportService.findSalesReport(new SalesReportCriteria());
    InputStream inputStream = new FileInputStream("report-template/saleReportTemplate.jrxml");
    String outputFilePdf = "D:/temp/BasicReport.pdf";
    String outputFileHtml = "D:/temp/BasicReport.html";
    Map paramMap = new HashMap();
    paramMap.put("ReportTitle", "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038");
    paramMap.put("TableDataSource", new JRBeanCollectionDataSource(saleReports));
    JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, paramMap, new JRBeanCollectionDataSource(saleReports));
    JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilePdf);
    JasperExportManager.exportReportToHtmlFile(jasperPrint, outputFileHtml);
}

font.xml

...other default config.

<fontFamily name="Myanmar3">
    <normal>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</normal>
    <bold>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</bold>
    <italic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</italic>
    <boldItalic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</boldItalic>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
</fontFamily>
…其他默认配置。
net/sf/jasperreports/font/myanmar3/myanmar3.TTF
net/sf/jasperreports/font/myanmar3/myanmar3.TTF
net/sf/jasperreports/font/myanmar3/myanmar3.TTF
net/sf/jasperreports/font/myanmar3/myanmar3.TTF
身份-H
真的
我已经测试了很多配置、参考和示例。但是,对
PDF
文件没有影响


如果您有任何建议和提供,请告诉我。

您能找到Jasper reports使用的文本呈现引擎吗

字体“Myanmar3”严重依赖OpenType功能来生成正确的字符序列。在相当高的级别上,文本呈现引擎依赖于低级别例程来正确处理字体内的字形绘制。也就是说,在最高级别,您可以发出命令来绘制特定的文本字符串。该字符串被分解为单独的字符,然后根据字体内部的OTF规则,这些字符可能被重新排序或替换为字形。只有在这之后,一个正确的字形字符串——不再是“字符”——才会被发回显示

从您的描述和屏幕截图来看,您的浏览器似乎可以使用这种字体,但Jasper reports不能。这在PDF中是可见的:输入字符串被正确分解(或者可能是以分解形式提供)为单独的基本图示符,但是基本图示符不会被文本呈现引擎替换回合成图示符。因此,在你的一些角色下面有点圆圈;这些只是占位符,从来就不应该被画出来

无法确定确切的故障点。字体“Myanmar3”包含
clig
liga
子表中的所有必要信息,这两个都没有什么特别之处。但是,脚本标记是
mymr
——可能文本呈现引擎不知道脚本特定的功能。另一种可能是它无法解释功能代码本身,因为这里似乎有许多复杂的链接上下文字符串

我不认为可以手动更改Jasper报告的文本呈现引擎?您可能希望将这个非常低级的问题转发给它的开发人员。

这是(版本测试为5.5.4)的问题,
ttf
字体,itext不支持连字,请参见下面的评论

由于jasper reports使用itext作为其库来呈现pdf,因此您可以在jasper report中执行任何操作来解决此问题

仅使用iText的示例代码将呈现与jasper report相同的输出

public class FontTest {

    /** The resulting PDF file. */
    public static final String RESULT = "pdf/fontTest.pdf";
    /** Test text. */
    public static final String TEST = "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038";

    public void createPdf(String filename) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        document.open();
        BaseFont bf = BaseFont.createFont(
            "lib/myanmar3.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bf, 20);
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(36, 730, 569, 36);
        column.addElement(new Paragraph(TEST, font));
        column.go();
        document.close();
    }

    public static void main(String[] args) throws IOException, DocumentException {
        new FontTest().createPdf(RESULT);
    }
}
我在一节中发布了一篇后续文章,以了解itext无法正确呈现字体的原因

这是(iText的原始开发者)的评论

“您看到的行为是由于iText不支持 连字。您需要下一个未发布的iText版本。 我们将于明年发布测试版,但仅面向客户。”


是否检查生成的pdf文件中的字体?真的是缅甸3号吗?@AlexK,是的,兄弟,我查了PDF的属性。字体中的“编码”是“缅甸3”。@AlexK,我会提交短屏幕吗?嗯。。。您是否尝试设置textField(不使用默认样式)元素的样式?是的,我尝试过。谢谢您的解释。
...other default config.

<fontFamily name="Myanmar3">
    <normal>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</normal>
    <bold>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</bold>
    <italic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</italic>
    <boldItalic>net/sf/jasperreports/fonts/myanmar3/MYANMAR3.TTF</boldItalic>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
</fontFamily>
public class FontTest {

    /** The resulting PDF file. */
    public static final String RESULT = "pdf/fontTest.pdf";
    /** Test text. */
    public static final String TEST = "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038";

    public void createPdf(String filename) throws IOException, DocumentException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        document.open();
        BaseFont bf = BaseFont.createFont(
            "lib/myanmar3.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bf, 20);
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(36, 730, 569, 36);
        column.addElement(new Paragraph(TEST, font));
        column.go();
        document.close();
    }

    public static void main(String[] args) throws IOException, DocumentException {
        new FontTest().createPdf(RESULT);
    }
}