【问题标题】:Jasper Reports bold style does not work with PDF ExporterJasper Reports 粗体样式不适用于 PDF 导出器
【发布时间】:2021-07-06 00:29:36
【问题描述】:

我使用 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 中部署我的项目时,没有出现粗体样式。我的 Dockerfile 如下:

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 中运行时才会出现粗体样式问题,知道为什么会发生吗?

【问题讨论】:

    标签: docker jasper-reports export-to-pdf


    【解决方案1】:

    问题是因为我使用shadow gradle插件来生成shadow jar,jasperreportsjasperreports-fonts库有jasperreports_extension.properties em> 文件在同一路径中。

    我在 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'
    }
    

    这个问题对找到解决方案很有用:Exception in net.sf.jasperreports.engine.JRRuntimeException UncaughtExceptionHandler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多