<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>PDF - tag - 沐木</title><link>https://oldletter.cn/tags/pdf/</link><description>PDF - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 25 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/pdf/" rel="self" type="application/rss+xml"/><item><title>PDF 模板生成实战：iText 5.x/9.x 方案对比与开源替代</title><link>https://oldletter.cn/posts/java-03-pdf-template/</link><pubDate>Thu, 15 Jun 2023 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-03-pdf-template/</guid><description><![CDATA[<blockquote>
<p>📅 2026-05-15 | 🏷️ Java, PDF, iText, OpenPDF, PDFBox | 📖 阅读约 15 分钟</p></blockquote>
<h2 id="一背景与问题">一、背景与问题</h2>
<p>在企业级应用中，大量业务文档需要模板化生成：保单、合同、告知书、发票、审批单……这些文档有三个共同特征：</p>
<ol>
<li><strong>格式固定</strong> — 排版、字体、Logo 位置都是确定的</li>
<li><strong>内容动态</strong> — 姓名、金额、日期等字段每次不同</li>
<li><strong>批量生产</strong> — 高峰期可能一次生成数千份</li>
</ol>
<p>常见做法是：<strong>先用 Word 制作模板 → 用 Java 填充数据 → 输出 PDF</strong>。</p>
<p>本文对比两种主流方案，给出完整代码和踩坑记录。</p>
<div class="details admonition note open">
    <div class="details-summary admonition-title">
        <i class="icon far fa-pen-to-square" aria-hidden="true"></i>A4 页面尺寸公式<i class="details-icon fas fa-angle-right" aria-hidden="true"></i>
    </div>
    <div class="details-content">
        <div class="admonition-content"><p>PDF 中常用的 A4 页面尺寸为 210mm × 297mm。在 iText 中使用 point（磅）为单位，换算关系：1 inch = 72 pt = 25.4 mm。</p>
<p>因此 A4 的磅值为：宽 595.28 pt，高 841.89 pt。</p>]]></description></item><item><title>问卷考试系统设计（六）：报告生成——模板引擎、AI 接入与 PDF 导出</title><link>https://oldletter.cn/posts/qnr-06-report-ai/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/qnr-06-report-ai/</guid><description><![CDATA[<p><strong>上一篇：<a href="/posts/qnr-05-frontend/" rel="">问卷考试系统设计（五）：前端引擎</a></strong></p>
<p>数据收集、评分计算都做完了，业务方更关心的是末尾一步：拿到一份类似样的报告。报告生成的完整链路：模板定结构、规则填数据、AI 写解读、图表画可视化、末尾拼成 PDF。</p>
<p>报告生成适合异步化，前端只订阅任务进度，不直接等待 PDF 渲染完成：</p>
<div class="mermaid" id="id-2" data-mermaid-definition="c2VxdWVuY2VEaWFncmFtCiAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnQgQVBJIGFzIOaKpeWRiiBBUEkKICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudCBRdWV1ZSBhcyDlvILmraXku7vliqEKICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudCBSdWxlIGFzIOinhOWImeino&#43;ivuwogICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50IEFJIGFzIEFJIOaWh&#43;ahiAogICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50IENoYXJ0IGFzIOWbvuihqOa4suafkwogICAgICAgICAgICAgICAgICAgIHBhcnRpY2lwYW50IFBERiBhcyBQREYg5a&#43;85Ye6CiAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnQgU1NFIGFzIFNTRSDov5vluqYKICAgICAgICAgICAgICAgICAgICBBUEktPj5RdWV1ZTog5o&#43;Q5Lqk6K&#43;E5YiG57uT5p6cCiAgICAgICAgICAgICAgICAgICAgUXVldWUtPj5TU0U6IDEwJSDlt7LmjqXmlLYKICAgICAgICAgICAgICAgICAgICBRdWV1ZS0&#43;PlJ1bGU6IOeUn&#43;aIkOinhOWImeino&#43;ivuwogICAgICAgICAgICAgICAgICAgIFF1ZXVlLT4&#43;QUk6IOeUn&#43;aIkOi&#43;heWKqeaWh&#43;ahiAogICAgICAgICAgICAgICAgICAgIFF1ZXVlLT4&#43;Q2hhcnQ6IOa4suafk&#43;WbvuihqCBQTkcKICAgICAgICAgICAgICAgICAgICBRdWV1ZS0&#43;PlBERjog5ou8IEhUTUwg5bm25a&#43;85Ye6IFBERgogICAgICAgICAgICAgICAgICAgIFF1ZXVlLT4&#43;U1NFOiAxMDAlIOaKpeWRiuWPr&#43;S4i&#43;i9vQ==">sequenceDiagram
                    participant API as 报告 API
                    participant Queue as 异步任务
                    participant Rule as 规则解读
                    participant AI as AI 文案
                    participant Chart as 图表渲染
                    participant PDF as PDF 导出
                    participant SSE as SSE 进度
                    API-&gt;&gt;Queue: 提交评分结果
                    Queue-&gt;&gt;SSE: 10% 已接收
                    Queue-&gt;&gt;Rule: 生成规则解读
                    Queue-&gt;&gt;AI: 生成辅助文案
                    Queue-&gt;&gt;Chart: 渲染图表 PNG
                    Queue-&gt;&gt;PDF: 拼 HTML 并导出 PDF
                    Queue-&gt;&gt;SSE: 100% 报告可下载</div><hr>
<h2 id="报告生成的几种模式">报告生成的几种模式</h2>
<p><strong>模板填充</strong>适合格式固定的报告，模板写好，变量一填就完事。</p>
<p><strong>规则引擎</strong>解决条件判断问题。焦虑得分 0-4 分是&quot;无焦虑&quot;，5-9 分是&quot;轻度焦虑&quot;，这种区间映射用硬编码也能写，但规则多了维护起来是噩梦。</p>
<p><strong>AI 生成</strong>处理自然语言解读。数字摆在那里，但用户要的是一段&quot;读得懂&quot;的文字。</p>
<p>实际项目中三者结合：模板定骨架，规则引擎填确定性结论，AI 只负责把结论写得更类似人话。先保证可复现，再谈润色。</p>]]></description></item></channel></rss>