java – 贾斯珀报告PDF格式的字符编码
我想在jasper报告中使用自定义字体. Myanmar3是缅甸的标准字体.
一切都还可以,但ReportTitle必须是缅甸的缅甸字体3. 谷歌还将缅甸3用于缅甸地区. 将报告导出为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","u1005u101Bu1004u103Au1038u1021u1004u103Au1038u1019u103Bu102Cu1038u1011u100Au103Au101Eu103Du1004u103Au1038u1001u103Cu1004u103Au1038"); 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文件没有影响. 如果您有任何建议并提供,请告诉我. 解决方法
这是
iText(版本测试5.5.4)和ttf字体的问题,itext不支持连字,请参阅下面的评论
由于jasper-reports使用itext作为其库来呈现pdf,因此在jasper报告中无法解决此问题. 仅使用iText的示例代码将呈现与jasper报告相同的输出 public class FontTest { /** The resulting PDF file. */ public static final String RESULT = "pdf/fontTest.pdf"; /** Test text. */ public static final String TEST = "u1005u101Bu1004u103Au1038u1021u1004u103Au1038u1019u103Bu102Cu1038u1011u100Au103Au101Eu103Du1004u103Au1038u1001u103Cu1004u103Au1038"; 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部分发布了一个跟进question,以了解为什么itext无法正确呈现字体. 这是@Bruno Lowagie(iText的原始开发者)的评论
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |