如何使用Flying Saucer生成不可编辑的PDF文件
Flying Saucer 生成不可编辑 PDF 实现方案
核心实现逻辑是通过配置PDF文档的加密权限,禁用编辑、修改、内容提取等相关权限位,基于Flying Saucer配套的iText 2.x API即可完成配置,无需引入额外依赖。
实现步骤
- 新增PDF加密配置监听器,在文档初始化阶段设置权限
你可以直接在现有Thymeleaf渲染HTML后转PDF的逻辑中,给ITextRenderer添加如下监听器配置即可:
import com.lowagie.text.pdf.PdfWriter; import org.xhtmlrenderer.pdf.ITextRenderer; import org.xhtmlrenderer.pdf.PDFCreationListener; import java.io.OutputStream; public class NonEditablePdfGenerator { // htmlContent 为Thymeleaf渲染完成的最终HTML字符串 public void generateNonEditablePdf(String htmlContent, OutputStream outputStream) throws Exception { ITextRenderer renderer = new ITextRenderer(); // 配置加密权限监听器 renderer.setListener(new PDFCreationListener() { @Override public void preOpen(ITextRenderer iTextRenderer) { PdfWriter pdfWriter = iTextRenderer.getWriter(); try { pdfWriter.setEncryption( // 打开文档的用户密码,传null代表无需密码即可打开 null, // 所有者密码,可自定义设置,持有所有者密码可获得完整权限 null, // 配置允许的权限,仅保留打印权限,其他所有编辑、修改、复制权限全部禁用 PdfWriter.ALLOW_PRINTING, // 加密算法选择AES128,兼容性最好 PdfWriter.ENCRYPTION_AES_128 ); } catch (Exception e) { throw new RuntimeException("PDF权限配置失败", e); } } @Override public void onClose(ITextRenderer iTextRenderer) { // 无需额外处理 } }); // 原有Flying Saucer生成PDF逻辑保持不变 renderer.setDocumentFromString(htmlContent); renderer.layout(); renderer.createPDF(outputStream, false); renderer.finishPDF(); outputStream.flush(); } }
权限配置说明
- 若需要完全禁用所有交互权限,仅允许查看,可以将权限位设置为
0,用户打开PDF后无法进行打印、复制、编辑等任何操作 - 多个权限可以通过
|拼接,比如同时允许打印和复制内容可以写为PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY - 若需要设置文档打开密码,可以将
setEncryption方法的第一个参数替换为自定义密码的字节数组,无密码的用户将无法打开文档
注意事项
- Flying Saucer默认依赖的是
com.lowagie:itext2.1.x版本的iText,不要使用5.x/7.x版本的Apache iText,包名和API不兼容 - 按上述配置生成的PDF在所有主流PDF阅读器中都会默认锁定编辑权限,普通用户无法直接修改内容
- 如果需要更高等级的防篡改能力,可以在生成PDF后额外添加数字签名,进一步保障文档不可篡改
内容的提问来源于stack exchange,提问作者Chamie
相关产品推荐
相关产品推荐

