我看书
我预计如果机器上没有安装字体,Jasper Reports会抛出JRFontNotFoundException
。
<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>
<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>
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);
}
}
原因是JrFontNotFoundException
仅在属性fontname
中的字体未安装时才引发:
当报表模板中用作fontname
属性值的字体名称未在任何运行时可用的JasperReports字体扩展中找到,也未在Java虚拟机可用的字体名称中找到时,引发异常。
如果属性pdffontname
中的字体没有安装(而不是使用任何其他已安装的字体),是否有任何方法可以中止PDF的生成?
您正在设置pdffontname
而不是fontname
pdffontname
是一种古老的方式,现在不推荐使用它来指示itext库应该使用的字体,如果字体丢失,jasper-reports将不会抛出JrFontNotFoundException
,相反,itext将抛出一个异常,该异常被捕获并作为JrRuntimeException
重新启动。
在itext中,Helvetica是作为afm
文件包含的,因此如果使用它,itext不会抛出任何异常,但是如果您在Jasper-Reports中指示了另一种字体(在您的情况下没有指示=default font),这并不能保证文本被正确地呈现。事实上,这是一团糟,pdffontname
和pfdencoding
都不推荐使用。
如果属性pdfFontName中的字体没有安装,有没有办法中止PDF的生成?
不要使用pdffontname
,但是如果您坚持(为了解决这个问题)还设置fontname=“helvetica”
,那么设置jasper-reports字体将引发JRFontNotFoundException
。
正确的方法是只设置fontname
,然后提供font-extensions,在font-extensions中包括实际的TTF
,指出编码以及是否应该嵌入。
问题内容: 并且我希望Jasper Reports会在计算机上未安装字体时抛出。 但是我的应用程序没有抛出,尽管我没有在任何(Jaspersoft Studios,JasperReports,Adobe Acrobat Reader)计算机上安装使用的字体“ Helvetica”。 JRXML: Maven依赖项: Java: 原因是仅在未安装属性中的font的情况下才会抛出该错误: 当在任何运行
下面是我的代码。当我运行它时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:3、Size:2中得到异常,而不是我的异常消息。谁能解释一下我做错了什么,为什么会这样?谢谢!
问题内容: 在Java 9中,在Set接口上引入了称为of()的新静态工厂方法,该方法接受多个元素,甚至是元素数组。 我想将一个列表变成一个集合,以删除集合中的所有重复条目,这可以使用以下方法完成(在Java 9之前): 但是我认为使用这种新的Java 9静态工厂方法很酷: 其中是先前定义的字符串列表。 但是,可惜的是,当元素重复时,java抛出了一个,该方法的Javadoc中也对此做了说明。为什
我有一个字符串包含这个。注意,JSON中没有“name”字段。如果我做了这样的事情: 然后我实际上会返回一个名称设置为null的Person对象。是否有一种方法可以将映射器配置为抛出异常,或者返回空引用而不是Person?我希望Jackson认为缺少字段是一种失败,而不希望对结果对象的字段进行显式的空检查。
我有一个使用Kafka Streams中的KTable的单实例java应用程序。直到最近,当一些消息突然消失时,我才可以使用KTable检索所有数据。那里应该有~33k条带有唯一密钥的消息。 当我想通过键检索消息时,我不会得到一些消息。我使用ReadOnlyKeyValueStore检索邮件: 这些是我为KafkaStreams设置的配置设置。 Kafka:0.10.2.0-cp1 合流:3.2.
问题内容: 考虑一下程序: 如果程序不带参数启动,则运行时类路径中是否需要Foo? 研究 报告链接错误时,Java语言规范相当模糊: 该规范为实现链接活动(以及由于递归,加载)的发生时间提供了实现上的灵活性,前提是尊重Java编程语言的语义,并且在初始化类或接口之前已对其进行了完全验证和准备,并且在链接过程中检测到的错误被抛出到程序中某个位置,在该位置程序执行了一些可能需要链接到错误所涉及的类或接