gpt4 book ai didi

java - 为什么在 Linux 中 PDF 中的文本会被截断?

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:42 26 4
gpt4 key购买 nike

我尝试格式化 Date在 Jasper Reports 中,它适用于 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 结果:

Windows

Linux 结果:

Linux

PDF 属性:

两个生成的 PDF 文件在 Acrobat Reader for Windows 中具有相同的字体属性:

PDF properties

如您所见,字体未嵌入。 (如果我添加依赖项 jasperreports-fonts 并删除属性 pdfFontNamepdfEncodingisPdfEmbedded,第二个字体“Helvetica”就会消失).

研究:

我读了:

解决方案似乎是嵌入字体,但它不起作用。

我使用字体“Helvetica”,这是默认字体之一,这就是原因,请参阅 Wikipedia :

These fonts, or suitable substitute fonts with the same metrics, must always be available in all PDF readers and so need not be embedded in a PDF

https://stackoverflow.com/a/27345103/5277820 :

If you use these fonts in iText, iText will ignore the embedded parameter, because it is safe to assume that Adobe Reader and other viewers can render these fonts correctly.

问题:

为什么相同的字体在Windows 和Linux 中有不同的宽度?或者为什么文本截断和/或换行不同?

最佳答案

要正确计算字体指标,字体需要可用于 java 虚拟机。

查看这个历史问题:Font is not available to the JVM with Jasper Reports , 显示了对已启动的旧错误的各种解决方案

然而,jasper-reports 的正确解决方案是使用字体扩展

如果您使用分发的jasperreports-font.jar,它包含这些字体:

DejaVu Sans
DejaVu Serif
DejaVu Sans Mono

您需要在字体名称示例 fontName="DejaVu Sans" 中使用其中之一,没有自动映射到其他字体,jar 物理上仅包含这些 .ttf 而不是其他(打开 jar 并验证不同版本的 jasper-reports)。

因此只有安装在 pc 上或包含在 font-extension 中的字体可用于 JVM。

如果您需要其他字体,最好的解决方案是生成您自己的字体扩展名,包括有效的 .ttf 字体,这可以在 IDE 中完成。

关于java - 为什么在 Linux 中 PDF 中的文本会被截断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39084407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com