iReport版本:3.7.1
我以两种方式解决了这个问题.
我的第一种方法
我正在创建一个pdf页面,iReport我有一个字段(从数据库)设置为字体Gujarati-Salarl(印度的区域语言的字体).
此字体在字体列表中可用iReport.当我点击预览时,我得到所需的输出,字段为所需的字体样式.
这里的一切都很好.
但pdf生成的文件仍包含相同的英文原始字体.
无论我是从应用程序调用报告还是从JAVA文件调用报告,结果都是一样的.
经过一番研究,我发现了这个,第二种方法
JRProperties.setProperty("net.sf.jasperreports.default.pdf.font.name", "C:\\Gujrati-Saral-1.ttf");
Run Code Online (Sandbox Code Playgroud)
这设置了所提供字体pdf的ttf字体,但现在整个版本pdf都是Guarati-saral字体,这不是我想要的.
有没有办法专门将此字体应用于该特定字段?
要么
当通过第二种方法进行时,有没有办法不将字体Guarati-saral应用于除所需字段之外的所有其他字段?
将Jasper升级到最后一个版本后,它停止找到一种字体:Symbol.其余的字体似乎没问题.我在运行jasper的同一目录中有一堆ttfs,程序只是一个生成PDF的小包装器,它抛出了这个错误:
net.sf.jasperreports.engine.util.JRFontNotFoundException: Font 'Symbol' is not available to the JVM. See the Javadoc for more details.
at net.sf.jasperreports.engine.util.JRFontUtil.checkAwtFont(JRFontUtil.java:358)
at net.sf.jasperreports.engine.util.JRStyledText.getAwtAttributedString(JRStyledText.java:226)
at net.sf.jasperreports.engine.fill.TextMeasurer.measure(TextMeasurer.java:362)
at net.sf.jasperreports.engine.fill.JRFillTextElement.chopTextElement(JRFillTextElement.java:1129)
at net.sf.jasperreports.engine.fill.JRFillStaticText.prepare(JRFillStaticText.java:183)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:329)
at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:419)
at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:378)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2028)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:757)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:269)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:127)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:942)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:860)
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:84)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
at XmlJasperInterface.report(XmlJasperInterface.java:82)
at XmlJasperInterface.main(XmlJasperInterface.java:60)</pre>
Run Code Online (Sandbox Code Playgroud)
程序运行的目录:
# ls *.ttf
arial.ttf arialbd.ttf lsans.ttf lsansd.ttf lsansi.ttf symbol.ttf
Run Code Online (Sandbox Code Playgroud)
找到所有其他字体.哦,在我的笔记本电脑(macosx)中,它工作正常,它只在服务器上断开(Debian).我打开了symbol.ttf,它在Mac OS X上打开正常(以防文件损坏).
可能会发生什么想法?
我正在使用Jaspersoft Studio 5.2,我使用Courier New字体进行了报告,当我将其导出为PDF时,它将字体更改为Arial.
我只使用Studio工具.当我预览报告是可以的,但是当我导出它时就会发生.
如何使用Courier New字体导出我的报告?
我在报告中使用的textField模型:
<textField pattern="dd/MM/yyyy HH:mm:ss">
<reportElement uuid="f50b279a-b480-498f-8af7-be7e23c4b80b" x="415" y="11" width="105" height="10"/>
<textElement>
<font fontName="Courier New" size="8"/>
</textElement>
<textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
</textField>
Run Code Online (Sandbox Code Playgroud) 我用文本字段硬编码了一个值
":$£?€???:"
Run Code Online (Sandbox Code Playgroud)
测试这些字符是否以PDF格式显示
但它只打印为
:$£€:
Run Code Online (Sandbox Code Playgroud)
我已经尝试将字体更改为"符号",但这并不能解决问题.
注意:我正在使用iReport 5.5
我正在使用 Jasper jar 生成关于我的 J2EE 项目的报告。我能够成功生成 PDF,没有任何问题。但是,我希望根据我们在一处配置的设置为所有 PDF 动态更改字体名称。
我开始知道有条件的风格,这对实现这一点很有用。但是,我确实有数百种字体,它们不能在每个地方都有条件地设置样式。这将使报告更糟糕。
我正在寻找合适的解决方案来帮助我动态更改 jasper PDF 上的字体。
我试图将jasper导出为pdf,但它没有显示西里尔值.当我将其导出为excel时,它确实显示并且输出正常,但是当我尝试导出为PDF时,它不会导出西里尔文值.西里尔字母不是用西里尔字母书写的,它们都是用西里尔字母键盘写成的.
我用来导出的代码是:
JRExporter e = new JRPdfExporter();
e.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint);
e.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, outStream);
e.setParameter(JRPdfExporterParameter.OUTPUT_FILE_NAME, NAME);
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过以下参数:
e.setParameter(JRPdfExporterParameter.CHARACTER_ENCODING, "UTF-8");
Run Code Online (Sandbox Code Playgroud)
但没有成功.有什么建议?
该JRProperties班已经被注释为过时,取而代之JRPropertiesUtil的文档中所述
我一直在使用它以下列方式设置属性(因为它是一个提供静态方法的类),
JRProperties.setProperty("net.sf.jasperreports.default.font.name", defaultPDFFont);
JRProperties.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");
(...)
Run Code Online (Sandbox Code Playgroud)
我认为这是一种不推荐的设置属性的方法。
我找到了两种符合 API 文档的方法,即直接使用的实例JasperReportsContext:
JasperReportsContext jasperReportsContext = DefaultJasperReportsContext.getInstance();
jasperReportsContext.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");
jasperReportsContext.setProperty("net.sf.jasperreports.default.font.name", defaultPDFFont);
(...)
Run Code Online (Sandbox Code Playgroud)
或者通过将JasperReportsContext实例传递给JRPropertiesUtil:
JasperReportsContext jasperReportsContext = DefaultJasperReportsContext.getInstance();
JRPropertiesUtil jrPropertiesUtil = JRPropertiesUtil.getInstance(jasperReportsContext);
jrPropertiesUtil.setProperty("net.sf.jasperreports.awt.ignore.missing.font", "true");
jrPropertiesUtil.setProperty("net.sf.jasperreports.default.font.name", defaultPDFFont);
(...)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
为报告打印机设置属性的推荐方法是什么?
我尝试在 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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
爪哇:
private byte[] createPdf() {
try { …Run Code Online (Sandbox Code Playgroud) 我读
我希望Jasper Reports会抛出一个JRFontNotFoundException如果机器上没有安装字体的话.
但我的应用程序并没有抛出JRFontNotFoundException,虽然我没有在任何(Jaspersoft Studios,JasperReports,Adobe Acrobat Reader)机器上安装使用过的字体"Helvetica".
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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
Java的:
private byte[] …Run Code Online (Sandbox Code Playgroud) 我的pom文件:
<!-- Jasper Dependency -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.6.0</version>
</dependency>
<!-- Jasper fonts dependency -->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.0.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
运行后:
镜像在 docker hub 上构建和推送。然后使用命令:docker stack deploy .. 我运行 4 个 docker 容器(数据库、前端、后端和网络)。当我尝试使用生成 pdf API 时,出现如下错误:
2018-10-25 17:46:18.997 DEBUG 1 --- [ XNIO-2 task-14] n.s.j.e.fonts.FontExtensionsRegistry : Loading font extensions from net/sf/jasperreports/fonts/fonts.xml
2018-10-25 17:46:18.999 DEBUG 1 --- [ XNIO-2 task-14] n.s.j.e.fonts.SimpleFontExtensionHelper : Parsing font family DejaVu Sans
2018-10-25 17:46:18.999 DEBUG 1 --- …Run Code Online (Sandbox Code Playgroud) 我目前有一个使用 Spring Boot 构建的应用程序。我正在使用 Jasper 报告。当我尝试生成报告时,出现以下错误:
java.lang.NullPointerException:无法从短数组加载,因为 java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1260) 处的“sun.awt.FontConfiguration.head”为空 ~[na:na]
该应用程序在我的计算机上运行良好,仅在 docker 中失败。
这是我的 Dockerfile:
FROM openjdk:17-alpine
EXPOSE 10093
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} site_informativo.jar
RUN apk update;
RUN apk add -f apt-utils;
RUN apk add -f libfreetype6;
RUN apk add --no-cache -f fontconfig;
RUN apk add -f fonts-dejavu;
RUN apk add -f msttcorefonts;
RUN apk add -f libfontconfig1;
RUN apk add -f freetype;
RUN fc-cache --force
ENTRYPOINT ["java","-jar","/site_informativo.jar"]
Run Code Online (Sandbox Code Playgroud)
我还在 pom.xml 中添加了 jasperreports-fonts EXTENSION 但问题仍然存在。
<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
<dependency> …Run Code Online (Sandbox Code Playgroud) jasper-reports ×11
java ×8
fonts ×6
docker ×2
alpine-linux ×1
dynamic ×1
ireport ×1
itext ×1
pdf ×1