dur dur - 2 months ago 39
Java Question

Why is text truncated in PDF with Linux?

I try to format a Date in Jasper Reports and it works with Windows but not with Linux. With Linux the resulting text is truncated.

Code:



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 dependencies:

<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);
}
}


Results:



Result with Windows:

Windows

Result with Linux:

Linux

PDF properties:

Both generated PDF files have the same font properties in Acrobat Reader for Windows:

PDF properties

As you can see, the font is not embedded. (Second font "Helvetica" disappears if I add dependency
jasperreports-fonts
and remove attributes
pdfFontName
,
pdfEncoding
and
isPdfEmbedded
).

Research:



I read:



and the solution seems to be to embed the font, but it doesn't work.

I use font "Helvetica" which is one of the default fonts and that's the reason, see 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


and http://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.


Question:



Why have the same font different widths with Windows and Linux? Or why is the text truncating and/or line wrapping different?

Answer

To calculate the font-metrics correctly, the font needs to be available to the java virtual macchine.

See this historical question: Font is not available to the JVM with Jasper Reports, that show various solution to the old error launched

However the correct solution with jasper-reports is to use font-extensions

If you use the distributed jasperreports-font.jar it contains these fonts:

DejaVu Sans
DejaVu Serif
DejaVu Sans Mono

You need to use one of these in font name example fontName="DejaVu Sans", there is no automatic mapping to other fonts, the jar physically contains only these .ttf and no other (open jar and verify for different version of jasper-reports).

Hence only font installed on the pc or included in font-extension are available for the JVM.

If you need other fonts, the best solution is to generate your own font-extension including a valid .ttf font this can be done from within the IDE.