JavaFX质保审核程序从数据库生成PDF/LaTeX报告的方案咨询
解决方案:JavaFX程序中从数据库生成PDF与LaTeX文档
针对你用NetBeans开发的JavaFX质保审核系统,我分PDF自动生成和LaTeX文档生成两部分给你具体的实现方案,还有适合NetBeans的工具建议:
一、动态生成质保审核PDF报告(替代Excel流程)
1. 推荐的Java库(无需插件,直接集成)
不用依赖NetBeans插件,用成熟的Java PDF生成库更灵活,推荐这两个:
- iText 7:功能强大,支持从模板生成或完全动态构建PDF,非常适合从数据库取数据填充内容
- Apache PDFBox:轻量简洁,适合生成结构简单的文档,也支持表单填充
2. 实现步骤(以iText 7为例)
步骤1:在NetBeans中添加依赖
如果用Maven,在pom.xml里加入:
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.2.5</version> </dependency>
如果是普通Java项目,直接下载iText的jar包添加到项目库即可。
步骤2:从数据库获取测试数据
假设你已经有JDBC连接工具类,先查询目标申请的测试数据:
// 示例:从test_data表获取选中申请的测试数据 public List<TestData> getTestDataByApplicationId(int appId) throws SQLException { List<TestData> dataList = new ArrayList<>(); String sql = "SELECT test_item, result, test_date FROM test_data WHERE application_id = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setInt(1, appId); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { TestData data = new TestData(); data.setTestItem(rs.getString("test_item")); data.setResult(rs.getString("result")); data.setTestDate(rs.getDate("test_date")); dataList.add(data); } } return dataList; }
步骤3:动态生成PDF
你可以先制作带表单域的PDF模板(用Adobe Acrobat),再填充数据;也可以完全动态构建文档,示例如下:
public void generateAuditPdf(int appId, String outputPath) throws IOException, SQLException { List<TestData> testDataList = getTestDataByApplicationId(appId); // 获取对应质保申请的基础信息 ApplicationInfo appInfo = getApplicationInfoById(appId); PdfWriter writer = new PdfWriter(outputPath); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf); // 添加标题与基础信息 document.add(new Paragraph("质保申请审核报告").setFontSize(18).setBold().setTextAlignment(TextAlignment.CENTER)); document.add(new Paragraph("申请编号:" + appInfo.getAppId()).setFontSize(12).setMarginTop(10)); document.add(new Paragraph("申请人:" + appInfo.getApplicant()).setFontSize(12)); // 添加测试数据表格 Table table = new Table(new float[]{2, 2, 1}); table.addHeaderCell(new Cell().add(new Paragraph("测试项"))); table.addHeaderCell(new Cell().add(new Paragraph("测试结果"))); table.addHeaderCell(new Cell().add(new Paragraph("测试日期"))); for (TestData data : testDataList) { table.addCell(new Cell().add(new Paragraph(data.getTestItem()))); table.addCell(new Cell().add(new Paragraph(data.getResult()))); table.addCell(new Cell().add(new Paragraph(data.getTestDate().toString()))); } document.add(table.setMarginTop(15)); document.close(); }
3. NetBeans相关工具
如果想要可视化编辑PDF模板,可以安装NetBeans PDF Editor插件,在插件中心搜索就能找到,能帮你快速制作带表单的PDF模板,之后用代码填充数据更高效。
二、生成LaTeX格式文档并调用数据库信息
1. 实现思路
LaTeX本质是文本文件,所以可以通过Java代码动态拼接LaTeX内容,再调用本地LaTeX编译器(比如TeX Live)生成PDF;用模板引擎能简化占位符替换的工作。
2. 具体实现步骤
步骤1:准备LaTeX模板
先写一个基础的LaTeX模板(比如audit_template.tex),用占位符标记需要替换的数据库数据:
\documentclass{article} \usepackage{ctex} \usepackage{booktabs} \begin{document} \title{质保申请审核报告} \author{质保审核系统} \date{\today} \maketitle \section{申请基本信息} 申请编号:{{appId}}\\ 申请人:{{applicant}}\\ 申请日期:{{appDate}} \section{测试数据记录} \begin{table}[h] \centering \begin{tabular}{lll} \toprule 测试项 & 测试结果 & 测试日期 \\ \midrule {{testDataRows}} \bottomrule \end{tabular} \end{table} \end{document}
步骤2:用Java代码替换占位符并生成.tex文件
推荐用FreeMarker模板引擎来简化拼接,避免手动拼接字符串的繁琐:
// 用FreeMarker模板引擎生成LaTeX内容 public void generateLatexFile(int appId, String templateDir, String outputTexPath) throws Exception { ApplicationInfo appInfo = getApplicationInfoById(appId); List<TestData> testDataList = getTestDataByApplicationId(appId); // 准备数据模型 Map<String, Object> dataModel = new HashMap<>(); dataModel.put("appId", appInfo.getAppId()); dataModel.put("applicant", appInfo.getApplicant()); dataModel.put("appDate", appInfo.getAppDate().toString()); // 拼接测试数据行 StringBuilder testRows = new StringBuilder(); for (TestData data : testDataList) { testRows.append(data.getTestItem()).append(" & ").append(data.getResult()) .append(" & ").append(data.getTestDate()).append(" \\\\ \n"); } dataModel.put("testDataRows", testRows.toString()); // 加载FreeMarker模板 Configuration cfg = new Configuration(Configuration.VERSION_2_3_32); cfg.setDirectoryForTemplateLoading(new File(templateDir)); Template template = cfg.getTemplate("audit_template.tex"); // 生成LaTeX文件 try (Writer writer = new FileWriter(outputTexPath)) { template.process(dataModel, writer); } }
步骤3:调用LaTeX编译器生成PDF
在Java中通过ProcessBuilder调用本地的LaTeX编译器(需要先安装TeX Live或MikTeX):
public void compileLatexToPdf(String texFilePath, String outputDir) throws IOException { // 调用pdflatex命令 ProcessBuilder pb = new ProcessBuilder("pdflatex", "-output-directory", outputDir, texFilePath); pb.redirectErrorStream(true); Process process = pb.start(); // 读取编译输出(用于调试) try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } // 等待编译完成 try { int exitCode = process.waitFor(); if (exitCode == 0) { System.out.println("LaTeX编译成功,PDF已生成"); } else { System.err.println("LaTeX编译失败,退出码:" + exitCode); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IOException("编译被中断", e); } }
3. NetBeans插件支持
- 安装LaTeX Editor插件:提供LaTeX语法高亮、代码补全,方便你编辑模板文件
- 如果需要可视化预览,可以安装TeX Preview插件,在NetBeans里直接预览LaTeX生成的PDF
三、额外建议
- 模板复用:不管是PDF还是LaTeX,尽量用模板方式,避免硬编码内容,后期维护更方便
- 异常处理:数据库查询、文件生成、编译过程都要加完善的异常处理,比如捕获SQL异常、IO异常
- 性能优化:如果数据量较大,尽量批量读取数据库数据,避免频繁查询
- 测试:先测试小数据量的文档生成,确保格式正确后再处理大量数据
内容的提问来源于stack exchange,提问作者Nelson Ortiz
相关产品推荐
相关产品推荐

