Jasper Reports 粗体样式不适用于 PDF Exporter
Jasper Reports bold style does not work with PDF Exporter
我使用默认字体 (Sans Serif) 使用 JasperSoft Studio 创建报告,我的项目在 build.gradle 文件中具有以下依赖项:
implementation "com.lowagie:itext:2.1.7.js8"
implementation "net.sf.jasperreports:jasperreports:6.17.0"
jrxml 模板是用 Jasper Reports 6.17.0 编译的,它包含静态文本和粗体样式的文本字段(标记样式)。当我 运行 我的电脑(macOS Big Sur)中的项目时,粗体样式没有出现在 pdf 输出中,所以我添加以下依赖项:
implementation "net.sf.jasperreports:jasperreports-fonts:6.17.0"
它在 macOS 中工作,但是当我在 Docker 中部署我的项目时,粗体样式没有出现。我的 Docker 文件如下:
FROM openjdk:11.0.11-jre-buster
COPY customer-microservice*.jar /usr/app/service.jar
ENTRYPOINT ["java", "-jar", "-D=java.awt.headless=true", "/usr/app/service.jar"]
导出PDF的java代码:
private JasperReport report(String jasperFilePath) throws Exception {
var inputStream = resourceResolver
.getResourceAsStream(jasperFilePath)
.orElseThrow(() -> new FileNotFoundException(jasperFilePath));
return (JasperReport) JRLoader.loadObject(inputStream);
}
public void exportPdf(String reportName, String customerData) throws Exception {
var jsonDataStream = new ByteArrayInputStream(customerData.getBytes());
JsonDataSource ds = new JsonDataSource(jsonDataStream);
JRFileVirtualizer fileVisualizer = new JRFileVirtualizer(100, "test");
Map<String, Object> m = new HashMap<>();
m.put(JRParameter.REPORT_VIRTUALIZER, fileVisualizer);
String jasperFilePath = "classpath:jasper/customer-report.jasper";
JasperPrint p = JasperFillManager.fillReport(report(jasperFilePath), m, ds);
// I use a docker volume to open the file in my computer
String destFinal = "/tmp/" + reportName;
JasperExportManager.exportReportToPdfFile(p, destFinal);
}
Jasper Reports 使用 Helvetica 字体导出 PDF 文件,所以我在 docker 容器中执行 fc-match:
# fc-match -s Helvetica
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSansMono-Bold.ttf: "DejaVu Sans Mono" "Bold"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
仅当我的项目 运行 在 Docker 中时才会出现粗体样式问题,知道为什么会这样吗?
问题是因为我正在使用 shadow gradle 插件生成影子 jar,jasperreports 和 jasperreports-fonts 库在同一路径中有 jasperreports_extension.properties 文件。
我在shadowJar任务中添加如下配置:
dependencies {
implementation "com.lowagie:itext:2.1.7.js8"
implementation "net.sf.jasperreports:jasperreports:6.17.0"
implementation "net.sf.jasperreports:jasperreports-fonts:6.17.0"
}
shadowJar {
// Add content from jasperreports and jasperreports-fonts libraries
append 'jasperreports_extension.properties'
}
这个问题对找到解决方案很有用:
我使用默认字体 (Sans Serif) 使用 JasperSoft Studio 创建报告,我的项目在 build.gradle 文件中具有以下依赖项:
implementation "com.lowagie:itext:2.1.7.js8"
implementation "net.sf.jasperreports:jasperreports:6.17.0"
jrxml 模板是用 Jasper Reports 6.17.0 编译的,它包含静态文本和粗体样式的文本字段(标记样式)。当我 运行 我的电脑(macOS Big Sur)中的项目时,粗体样式没有出现在 pdf 输出中,所以我添加以下依赖项:
implementation "net.sf.jasperreports:jasperreports-fonts:6.17.0"
它在 macOS 中工作,但是当我在 Docker 中部署我的项目时,粗体样式没有出现。我的 Docker 文件如下:
FROM openjdk:11.0.11-jre-buster
COPY customer-microservice*.jar /usr/app/service.jar
ENTRYPOINT ["java", "-jar", "-D=java.awt.headless=true", "/usr/app/service.jar"]
导出PDF的java代码:
private JasperReport report(String jasperFilePath) throws Exception {
var inputStream = resourceResolver
.getResourceAsStream(jasperFilePath)
.orElseThrow(() -> new FileNotFoundException(jasperFilePath));
return (JasperReport) JRLoader.loadObject(inputStream);
}
public void exportPdf(String reportName, String customerData) throws Exception {
var jsonDataStream = new ByteArrayInputStream(customerData.getBytes());
JsonDataSource ds = new JsonDataSource(jsonDataStream);
JRFileVirtualizer fileVisualizer = new JRFileVirtualizer(100, "test");
Map<String, Object> m = new HashMap<>();
m.put(JRParameter.REPORT_VIRTUALIZER, fileVisualizer);
String jasperFilePath = "classpath:jasper/customer-report.jasper";
JasperPrint p = JasperFillManager.fillReport(report(jasperFilePath), m, ds);
// I use a docker volume to open the file in my computer
String destFinal = "/tmp/" + reportName;
JasperExportManager.exportReportToPdfFile(p, destFinal);
}
Jasper Reports 使用 Helvetica 字体导出 PDF 文件,所以我在 docker 容器中执行 fc-match:
# fc-match -s Helvetica
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
DejaVuSerif.ttf: "DejaVu Serif" "Book"
DejaVuSansMono-Bold.ttf: "DejaVu Sans Mono" "Bold"
DejaVuSerif-Bold.ttf: "DejaVu Serif" "Bold"
仅当我的项目 运行 在 Docker 中时才会出现粗体样式问题,知道为什么会这样吗?
问题是因为我正在使用 shadow gradle 插件生成影子 jar,jasperreports 和 jasperreports-fonts 库在同一路径中有 jasperreports_extension.properties 文件。
我在shadowJar任务中添加如下配置:
dependencies {
implementation "com.lowagie:itext:2.1.7.js8"
implementation "net.sf.jasperreports:jasperreports:6.17.0"
implementation "net.sf.jasperreports:jasperreports-fonts:6.17.0"
}
shadowJar {
// Add content from jasperreports and jasperreports-fonts libraries
append 'jasperreports_extension.properties'
}
这个问题对找到解决方案很有用: