【发布时间】:2016-12-29 07:01:24
【问题描述】:
我尝试在 Jasper Reports 中格式化 Date,它适用于 Windows,但不适用于 Linux。在 Linux 中,生成的文本会被截断。
代码:
JRXML:
<parameter name="timestamp" class="java.util.Date"/>
[...]
<textField>
<reportElement x="0" y="0" width="50" height="16" uuid="0007846a-26f1-457a-a198-67a2f7c8417c">
<property name="local_mesure_unitwidth" value="pixel"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="local_mesure_unitx" value="pixel"/>
<property name="com.jaspersoft.studio.unit.x" value="px"/>
<property name="local_mesure_unity" value="pixel"/>
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="local_mesure_unitheight" value="pixel"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<box padding="2"/>
<textElement textAlignment="Left" verticalAlignment="Top">
<font size="8" pdfFontName="Helvetica" pdfEncoding="Cp1250" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[DATEFORMAT($P{timestamp},"dd.MM HH:mm")]]></textFieldExpression>
</textField>
Maven 依赖项:
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-functions</artifactId>
<version>5.6.0</version>
</dependency>
Java:
private byte[] createPdf() {
try {
InputStream is = getClass().getResourceAsStream("MyReport.jasper");
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("timestamp", new Date());
JRDataSource jrDataSource = new JRBeanCollectionDataSource(new Vector(), false);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);
byte[] pdf = JasperExportManager.exportReportToPdf(jasperPrint);
return pdf;
} catch (JRException e) {
throw new RuntimeException("Could not create PDF.", e);
}
}
结果:
Windows 的结果:
Linux 的结果:
PDF 属性:
两个生成的 PDF 文件在 Acrobat Reader for Windows 中具有相同的字体属性:
如您所见,字体未嵌入。 (如果我添加依赖项jasperreports-fonts 并删除属性pdfFontName、pdfEncoding和isPdfEmbedded,第二个字体“Helvetica”就会消失。
研究:
我读到了:
- PDF generated with jasperreport not showing well on Linux but yes on Mac, could the os be related?
- http://community.jaspersoft.com/questions/527138/pdf-text-truncated-linux-fine-windows
- http://community.jaspersoft.com/questions/803503/why-text-filed-value-will-be-truncated-if-application-running-linux
并且解决方案似乎是嵌入字体,但它不起作用。
我使用字体“Helvetica”,这是默认字体之一,这就是原因,请参阅Wikipedia:
这些字体或具有相同度量的合适替代字体必须始终在所有 PDF 阅读器中可用,因此无需嵌入到 PDF 中
和https://stackoverflow.com/a/27345103/5277820:
如果您在 iText 中使用这些字体,iText 将忽略嵌入参数,因为可以安全地假设 Adobe Reader 和其他查看器可以正确呈现这些字体。
问题:
为什么相同的字体在 Windows 和 Linux 下宽度不同?或者为什么文本截断和/或换行不同?
【问题讨论】:
-
是的,您应该始终嵌入字体,以避免出现问题。请参阅帖子stackoverflow.com/a/26632606/5292302 中的 4 个错误(答案来自 itext 创始人),这不是最佳示例,但始终提供编码实践的想法,提供并嵌入字体
标签: java fonts jasper-reports pdf-generation export-to-pdf