为什么使用Linux将文本截断为PDF格式?

我尝试在Jasper Reports中格式化日期 ,它适用于Windows,但不适用于Linux。 使用Linux时,生成的文本将被截断。

码:

JRXML:

 [...]                  

Maven依赖:

  net.sf.jasperreports jasperreports 5.6.0   net.sf.jasperreports jasperreports-functions 5.6.0  

Java的:

 private byte[] createPdf() { try { InputStream is = getClass().getResourceAsStream("MyReport.jasper"); JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is); Map parameters = new HashMap(); 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的结果:

Linux的

PDF属性:

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

PDF属性

如您所见,字体未嵌入。 (如果我添加依赖关系pdfFontName jasperreports-fonts并删除属性pdfFontNamepdfEncodingisPdfEmbedded ,则第二个字体“Helvetica”消失。

研究:

我读:

  • 使用jasperreport生成的PDF在Linux上不能很好地显示但在Mac上是的,是否可能与os相关?
  • 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”这是默认字体之一,这就是原因,请参阅维基百科 :

这些字体或具有相同指标的合适替代字体必须始终在所有PDF阅读器中可用,因此无需嵌入PDF中

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

如果您在iText中使用这些字体,iText将忽略嵌入参数,因为可以安全地假设Adobe Reader和其他查看者可以正确呈现这些字体。

题:

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

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

请参阅此历史问题: 带有Jasper Reports的JVM无法使用字体 ,它显示了启动的旧错误的各种解决方案

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

如果您使用分布式jasperreports-font.jar它包含以下字体:

DejaVu Sans
DejaVu Serif
DejaVu Sans Mono

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

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

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

永远不要假设客户端系统上有特定的字体 – 市面上只有几种桌面操作系统的日子已经过去了,这些操作系统只有几种西方语言,并且有着名的字体列表已经稳定了几十年。

现在,创建新字体,用户使用自己的语言访问内容(使用特定语言字体)变得更加容易,行业每隔几年推出新的外形(使用新的虚荣字体),Unicode.org发布新规范(需要检修)现有字体)因此,不同系统上存在的实际字体差异很大。

OSX和Windows在旧的“固定字体列表”模式下仍然有些function,但新进入者没有。

对于PDF,这意味着您必须在文档中嵌入字体。 对于网络而言,这意味着灵活的网站设计不依赖于精确的像素字母尺寸。

尝试使用像Helvetica或Arial这样的旧遗留字体是一个病态案例:客户端根本不会安装它,并将其别名为具有不同字形指标的东西,或者它将具有古老版本,缺乏自ASCII以来添加的所有代码点都不受欢迎,并且无法呈现现代国际文本。 由于长窗占主导地位,Arial更有可能工作,但这种情况正在迅速消失。