itext pdf设置密码、权限和添加水印功能 您所在的位置:网站首页 PDF中加水印和密码 itext pdf设置密码、权限和添加水印功能

itext pdf设置密码、权限和添加水印功能

2024-07-07 13:10| 来源: 网络整理| 查看: 265

文章目录 一、Maven依赖二、PDF设置密码与编辑权限1、userPassword2、ownerPassword3、permissions4、encryptionType 三、添加水印1、读取pdf文件的方式创建水印2、Document创建pdf的方式添加水印 四、常见异常

一、Maven依赖 com.itextpdf itextpdf 5.5.13.3 org.bouncycastle bcprov-jdk15on 1.70 com.itextpdf itext-asian 5.2.0

itextpdf是pdf操作的核心,bcprov-jdk15on用于pdf加密,itext-asian是亚洲字体

二、PDF设置密码与编辑权限

如果是读取本地pdf文件则可以用pdfStamper.setEncryption方法

// is为pdf文件输入流,os为要输出的文件流 PdfReader reader = new PdfReader(is); PdfStamper stamper = new PdfStamper(reader, os); // 设密码,禁止编辑 stamper.setEncryption("userPassword".getBytes(StandardCharsets.UTF_8), "ownerPassword".getBytes(StandardCharsets.UTF_8), PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY, PdfWriter.ENCRYPTION_AES_128);

如果是创建的pdf则可以用pdfWriter.setEncryption方法

// os为要输出的文件流 Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, os); writer.setEncryption("userPassword".getBytes(StandardCharsets.UTF_8), "ownerPassword".getBytes(StandardCharsets.UTF_8), PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_COPY, PdfWriter.ENCRYPTION_AES_128);

setEncrption有4个参数:userPassword, ownerPassword, permissions, encryptionType

1、userPassword

userPassword为用户密码,当用户打开时输入此密码将被赋予相应权限(见下面),该选项可以填null,表示无密码

2、ownerPassword

ownerPassword为管理员密码,将获得文档全部权限,也可以填null

3、permissions

permissions为用户权限,多个权限以或(|)连接

PdfWriter.ALLOW_PRINTING:允许打印PdfWriter.ALLOW_MODIFY_CONTENTS:允许编辑内容PdfWriter.ALLOW_COPY:允许复制PdfWriter.ALLOW_MODIFY_ANNOTATIONS:允许编辑注释PdfWriter.ALLOW_FILL_IN:允许填充表单(128位加密)PdfWriter.ALLOW_SCREENREADERS:允许用户提取文本和图形以供易访问性设备使用(128位加密)PdfWriter.ALLOW_ASSEMBLY:允许用户插入、删除和旋转页面和添加书签(128位加密)PdfWriter.ALLOW_DEGRADED_PRINTING:允许低质量打印(128位加密) 4、encryptionType

encryptionType为加密方式,有4种: PdfWriter.STANDARD_ENCRYPTION_40 PdfWriter.STANDARD_ENCRYPTION_128 PdfWriter.ENCRYPTION_AES_128 PdfWriter.ENCRYPTION_AES_256

最终效果 输入密码 权限

三、添加水印 1、读取pdf文件的方式创建水印

从本地或服务器获取pdf文件输入流,添加水印并输出

// is为文件输入流,os为文件输出流,password为密码,watermark为水印字符串 PdfReader reader = new PdfReader(is); PdfStamper stamper = new PdfStamper(reader, os); // 设密码,禁止编辑 stamper.setEncryption(password == null ? null : password.getBytes(StandardCharsets.UTF_8), null, PdfWriter.ALLOW_COPY, PdfWriter.ENCRYPTION_AES_128); // 水印字体 BaseFont base = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.EMBEDDED); Rectangle pageRect = null; PdfGState gs = new PdfGState(); gs.setFillOpacity(0.3f); gs.setStrokeOpacity(0.4f); int total = reader.getNumberOfPages() + 1; JLabel label = new JLabel(); FontMetrics metrics; int textH = 0; int textW = 0; label.setText(watermark); metrics = label.getFontMetrics(label.getFont()); textH = metrics.getHeight(); textW = metrics.stringWidth(label.getText()); PdfContentByte under; // pdf每一页加水印 for (int i = 1; i for (int width = textW; width @Override public void onOpenDocument(PdfWriter pdfWriter, Document document) {} @Override public void onStartPage(PdfWriter pdfWriter, Document document) { // 新的一页被创建后添加水印 Rectangle pageRect; PdfGState gs = new PdfGState(); gs.setFillOpacity(0.3f); gs.setStrokeOpacity(0.4f); JLabel label = new JLabel(); FontMetrics metrics; label.setText(watermark); metrics = label.getFontMetrics(label.getFont()); int textH = metrics.getHeight(); int textW = metrics.stringWidth(label.getText()); pageRect = pdfWriter.getPageSize(); PdfContentByte under = pdfWriter.getDirectContentUnder(); under.saveState(); under.setGState(gs); under.beginText(); under.setFontAndSize(base, 20); under.setRGBColorFill(145,145,145); // 页面填充水印 for (int height = textH; height under.showTextAligned( Element.ALIGN_LEFT, watermark, width - textW, height - textH, 30); // rotation是水印倾斜角度 } } under.endText(); under.restoreState(); } @Override public void onEndPage(PdfWriter pdfWriter, Document document) { } @Override public void onCloseDocument(PdfWriter pdfWriter, Document document) { } @Override public void onParagraph(PdfWriter pdfWriter, Document document, float v) { } @Override public void onParagraphEnd(PdfWriter pdfWriter, Document document, float v) { } @Override public void onChapter(PdfWriter pdfWriter, Document document, float v, Paragraph paragraph) { } @Override public void onChapterEnd(PdfWriter pdfWriter, Document document, float v) { } @Override public void onSection(PdfWriter pdfWriter, Document document, float v, int i, Paragraph paragraph) { } @Override public void onSectionEnd(PdfWriter pdfWriter, Document document, float v) { } @Override public void onGenericTag(PdfWriter pdfWriter, Document document, Rectangle rectangle, String s) { } }); document.open(); // 添加一些文本测试 for (int i = 0; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有