我正在尝试在jasper报告中使用自定义字体。 Myanmar3
是缅甸的标准字体。
一切正常,但ReportTitle
必须Myanmar Font
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);
}
saleReportTemplate.jrxml
<?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="TableReport" pageWidth="842" pageHeight="595" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="802"
leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30" isFloatColumnFooter="true" whenResourceMissingType="Empty" uuid="a255c602-4ff1-4db8-ab72-65b5c3ff9bdd">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<style name="Myanmar3" isDefault="true" fontName="Myanmar3" fontSize="10" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false"/>
<style name="Table">
<box leftPadding="0">
<pen lineWidth="1.0" lineColor="#000000"/>
</box>
</style>
<style name="TableHeader" mode="Opaque" backcolor="#808080"/>
<style name="TableFooter" mode="Opaque" backcolor="#C0C0C0"/>
<subDataset name="TableData" uuid="41cd3dac-2d22-41b9-9872-8fdb465d0f85">
<field ... for table generation/>
</subDataset>
<parameter name="TableDataSource" class="net.sf.jasperreports.engine.JRDataSource"/>
<parameter name="ReportTitle" class="java.lang.String" isForPrompting="false"/>
<title>
<band height="153">
<textField isBlankWhenNull="true">
<reportElement uuid="b44cb7c1-f7d5-467c-8982-b95f65dcb849" x="106" y="0" width="573" height="59"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="22" isBold="true" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{ReportTitle}]]></textFieldExpression>
</textField>
<componentElement>
-->other tag for table....
</componentElement>
</band>
</title>
</jasperReport>
我已添加MYANMAR3.TTF
个文件,并在jasperreports-fonts-5.1.0.jar
中配置myanmar3
字体。
jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml
net.sf.jasperreports.extension.simple.font.families.myanmar3=net/sf/jasperreports/fonts/fonts.xml
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>
我已经测试了很多配置,参考和示例。但是,对PDF
文件没有影响。
如果您有任何建议并提供,请与我们联系。
答案 0 :(得分:3)
这是iText(版本测试5.5.4)和ttf
字体,itext 不支持连字的问题,请参阅下面的评论
由于jasper-reports使用itext作为其库来呈现pdf,因此您可以在jasper报告中执行 nothing 来解决此问题。
使用仅iText 的示例代码会将相同的输出呈现为jasper报告
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);
}
}
我已在question部分发布了跟进itext,以了解为什么itext无法正确呈现字体。
这是@Bruno Lowagie(iText的原始开发者)的评论
&#34;您看到的行为是因为iText 不支持 连字即可。您需要下一个未发布的iText版本之一。 我们明年将发布测试版,但仅限于客户。&#34;
答案 1 :(得分:0)
你能找到Jasper-reports使用的文本渲染引擎吗?
字体'Myanmar3'在OpenType功能上依赖重来生成正确的字符序列。在相当高的级别,文本呈现引擎依赖低级别例程来正确处理字体内的字形。也就是说,在最高级别,您可以使用命令绘制特定的文本字符串。此字符串被分解为单独的字符,然后可能会根据字体内的OTF规则重新排序或替换为字形。只有在那之后,才会发回正确的字形字符串 - 不再是“字符” - 以显示。
根据您的描述和屏幕截图,您的浏览器可以使用此字体,但Jasper-reports不能。这在PDF中可见:您的输入字符串被正确分解(或者您可能以分解形式提供)到单独的基本字形中,但是基本字形不会被文本呈现引擎替换回组合字形。因此,你的一些角色下面的虚线圈;这些只是占位符,并且从未打算被绘制。
无法确定准确的失败点。字体'Myanmar3'包含clig
和liga
子表中的所有必要信息,这两个没有什么特别之处。但是,脚本标记是mymr
- 文本呈现引擎可能不知道脚本特定的功能。另一种可能性是它无法解释特征代码本身,因为这里似乎有许多复杂的链接上下文字符串。
我不认为可以手动更改Jasper报告的文本呈现引擎吗?您可能希望将此非常低级问题转发给开发人员。