pom.xml引入

<!-- pdf文档生成 --><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version></dependency><dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.0.3</version></dependency><!-- itext对pdf文档操作 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

创建PDF操作工具类PdfUtils

package com.ruoyi.common.utils.pdf;import com.itextpdf.text.*;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.util.List;public class PdfUtils {/*** pdf加密** @param filePath  输入文件路径* @param savePath  输出文件路径* @param password  密码* @return*/public static boolean pdfEncrypt(String filePath, String savePath, String password){try{PdfReader reader = new PdfReader(filePath);PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(savePath));//ALLOW_PRINTING   文档允许打印//ALLOW_DEGRADED_PRINTING 允许用户打印文档,但不提供allow_printing质量(128位加密)//ALLOW_MODIFY_CONTENTS   允许用户修改内容,例如 更改页面内容,或插入或删除页//ALLOW_ASSEMBLY    允许用户插入、删除和旋转页面和添加书签。页面的内容不能更改,除非也授予allow_modify_contents权限,(128位加密)//ALLOW_COPY 允许用户复制或以其他方式从文档中提取文本和图形,包括使用辅助技术。例如屏幕阅读器或其他可访问设备//ALLOW_SCREENREADERS    允许用户提取文本和图形以供易访问性设备使用,(128位加密)//ALLOW_MODIFY_ANNOTATIONS   允许用户添加或修改文本注释和交互式表单字段//ALLOW_FILL_IN    允许用户填写表单字段,(128位加密)//访问者密码,拥有者密码(权限密码让pdf文件无法被修改),访问者权限,加密方式。stamper.setEncryption(null, password.getBytes(),PdfWriter.ALLOW_COPY|PdfWriter.ALLOW_DEGRADED_PRINTING,PdfWriter.STANDARD_ENCRYPTION_128);stamper.close();reader.close();return true;}catch (Exception e){e.printStackTrace();return false;}}/*** pdf添加水印** @param inputFile     需要添加水印的文件* @param outputFile    添加完水印的文件存放路径* @param waterMarkName 需要添加的水印文字* @param opacity       水印字体透明度* @param fontsize      水印字体大小* @param angle         水印倾斜角度(0-360)* @param heightdensity 数值越大每页竖向水印越少* @param widthdensity  数值越大每页横向水印越少* @param cover         是否覆盖* @return*/public static boolean addwaterMark(String inputFile, String outputFile, String waterMarkName,float opacity, int fontsize, int angle, int heightdensity, int widthdensity, boolean cover) {if (!cover) {File file = new File(outputFile);if (file.exists()) {return true;}}File file = new File(inputFile);if (!file.exists()) {return false;}PdfReader reader = null;PdfStamper stamper = null;try {int interval = -5;reader = new PdfReader(inputFile);stamper = new PdfStamper(reader, new FileOutputStream(outputFile));BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);Rectangle pageRect = null;PdfGState gs = new PdfGState();//这里是透明度设置gs.setFillOpacity(opacity);//这里是条纹不透明度gs.setStrokeOpacity(0.2f);int total = reader.getNumberOfPages() + 1;System.out.println("Pdf页数:" + reader.getNumberOfPages());JLabel label = new JLabel();FontMetrics metrics;int textH = 0;int textW = 0;label.setText(waterMarkName);metrics = label.getFontMetrics(label.getFont());//字符串的高,   只和字体有关textH = metrics.getHeight();//字符串的宽textW = metrics.stringWidth(label.getText());PdfContentByte under;//这个循环是确保每一张PDF都加上水印for (int i = 1; i < total; i++) {pageRect = reader.getPageSizeWithRotation(i);under = stamper.getOverContent(i);  //在内容上方添加水印//under = stamper.getUnderContent(i);  //在内容下方添加水印under.saveState();under.setGState(gs);under.beginText();//under.setColorFill(BaseColor.PINK);  //添加文字颜色  不能动态改变 放弃使用under.setFontAndSize(base, fontsize); //这里是水印字体大小for (int height = textH; height < pageRect.getHeight() * 2; height = height + textH * heightdensity) {for (int width = textW; width < pageRect.getWidth() * 1.5 + textW; width = width + textW * widthdensity) {// rotation:倾斜角度under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW, height - textH, angle);}}//添加水印文字under.endText();}System.out.println("添加水印成功!");return true;} catch (IOException e) {System.out.println("添加水印失败!错误信息为: " + e);e.printStackTrace();return false;} catch (DocumentException e) {System.out.println("添加水印失败!错误信息为: " + e);e.printStackTrace();return false;} finally {//关闭流if (stamper != null) {try {stamper.close();} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {reader.close();}}}public static File mergeFiles(String[] files, String result, boolean smart) throws IOException, DocumentException {Document document = new Document();PdfCopy copy;if (smart)copy = new PdfSmartCopy(document, new FileOutputStream(result));elsecopy = new PdfCopy(document, new FileOutputStream(result));document.open();PdfReader[] reader = new PdfReader[files.length];for (int i = 0; i < files.length; i++) {reader[i] = new PdfReader(files[i]);copy.addDocument(reader[i]);copy.freeReader(reader[i]);reader[i].close();}document.close();return new File(result);}/*** 合并pdf** @param streamOfPDFFiles* @param outputStream* @param paginate*/public static void concatPDFs(java.util.List<InputStream> streamOfPDFFiles,OutputStream outputStream, boolean paginate) {Document document = new Document();try {java.util.List<InputStream> pdfs = streamOfPDFFiles;List<PdfReader> readers = new ArrayList<PdfReader>();int totalPages = 0;Iterator<InputStream> iteratorPDFs = pdfs.iterator();// Create Readers for the pdfs.while (iteratorPDFs.hasNext()) {InputStream pdf = iteratorPDFs.next();PdfReader pdfReader = new PdfReader(pdf);readers.add(pdfReader);totalPages += pdfReader.getNumberOfPages();}// Create a writer for the outputstreamPdfWriter writer = PdfWriter.getInstance(document, outputStream);document.open();BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,BaseFont.CP1252, BaseFont.NOT_EMBEDDED);PdfContentByte cb = writer.getDirectContent(); // Holds the PDF// dataPdfImportedPage page;int currentPageNumber = 0;int pageOfCurrentReaderPDF = 0;Iterator<PdfReader> iteratorPDFReader = readers.iterator();// Loop through the PDF files and add to the output.while (iteratorPDFReader.hasNext()) {PdfReader pdfReader = iteratorPDFReader.next();// Create a new page in the target for each source page.while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {document.newPage();pageOfCurrentReaderPDF++;currentPageNumber++;page = writer.getImportedPage(pdfReader,pageOfCurrentReaderPDF);cb.addTemplate(page, 0, 0);// Code for pagination.if (paginate) {cb.beginText();cb.setFontAndSize(bf, 9);cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""+ currentPageNumber + " of " + totalPages, 520,5, 0);cb.endText();}}pageOfCurrentReaderPDF = 0;}outputStream.flush();document.close();outputStream.close();} catch (Exception e) {e.printStackTrace();} finally {if (document.isOpen())document.close();try {if (outputStream != null)outputStream.close();} catch (IOException ioe) {ioe.printStackTrace();}}}/*** <br>* <p>* Description: 给pdf文件添加水印 <br>* <p><br/>* <p>** @param InPdfFile     要加水印的原pdf文件路径* @param outPdfFile    加了水印后要输出的路径* @param markImagePath 水印图片路径* @param imgWidth      图片横坐标* @param imgHeight     图片纵坐标* @throws Exception*/public static void addPdfImgMark(String InPdfFile, String outPdfFile, String markImagePath, int imgWidth, int imgHeight) throws Exception {PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));PdfContentByte under;PdfGState gs1 = new PdfGState();gs1.setFillOpacity(0.5f);// 透明度设置com.itextpdf.text.Image img = Image.getInstance(markImagePath);// 插入图片水印img.setAbsolutePosition(imgWidth, imgHeight); // 坐标
//        img.setRotation(-20);// 旋转 弧度
//        img.setRotationDegrees(45);// 旋转 角度// img.scaleAbsolute(200,100);//自定义大小// img.scalePercent(50);//依照比例缩放int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数for (int i = 1; i <= pageSize; i++) {under = stamp.getUnderContent(i);// 水印在之前文本下// under = stamp.getOverContent(i);//水印在之前文本上under.setGState(gs1);// 图片水印 透明度under.addImage(img);// 图片水印}stamp.close();// 关闭// // 删除不带水印文件
//      File tempfile = new File(InPdfFile);
//      if(tempfile.exists()) {
//          tempfile.delete();
//      }}/*** <br>* <p>* Description: 给pdf文件添加水印<br>** @param InPdfFile  要加水印的原pdf文件路径* @param outPdfFile 加了水印后要输出的路径* @param textMark   水印文字* @param textWidth  文字横坐标* @param textHeight 文字纵坐标* @throws Exception*/public static void addPdfTextMark(String InPdfFile, String outPdfFile, String textMark, int textWidth,int textHeight) throws Exception {PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));PdfContentByte under;BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", "Identity-H", true);// 使用系统字体int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数for (int i = 1; i <= pageSize; i++) {under = stamp.getUnderContent(i);// 水印在之前文本下// under = stamp.getOverContent(i);//水印在之前文本上under.beginText();under.setColorFill(BaseColor.GRAY);// 文字水印 颜色under.setFontAndSize(font, 38);// 文字水印 字体及字号under.setTextMatrix(textWidth, textHeight);// 文字水印 起始位置under.showTextAligned(Element.ALIGN_CENTER, textMark, textWidth, textHeight, 45);under.endText();}stamp.close();// 关闭}}

Controller中调用

/*** word转pdf** @param fileName 文件名* @return*/@PostMapping("/wordTurnPdf")public Map<String, Object> wordTurnPdf(String fileName) {System.out.println("文件名:" + fileName);try {//截取文件前缀String caselsh = fileName.substring(0, fileName.lastIndexOf("."));//需要转换的word文件File inputWord = new File("D:\\test\\" + fileName);//转换后生成的pdf文件File outputFile = new File("D:\\test\\" + caselsh + ".pdf");InputStream docxInputStream = new FileInputStream(inputWord);OutputStream outputStream = new FileOutputStream(outputFile);IConverter converter = LocalConverter.builder().build();converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();outputStream.close();return AjaxResult.success("D:\\test\\" + caselsh + ".pdf");} catch (Exception e) {e.printStackTrace();return AjaxResult.error("系统错误");}}/*** 下载pdf(加水印)** @param fileName* @param response* @return*/@PostMapping("downloadFile")public AjaxResult downloadFile(String fileName, HttpServletResponse response) {//需要添加水印的文件String inputFile = "D:\\test\\test.pdf";//添加完水印的文件存放路径String outputFile = "D:\\test\\test(水印).pdf";//需要添加的水印文字String waterMarkName = "测试水印";//水印字体透明度float opacity = 0.3f;//水印字体大小int fontsize = 30;//水印倾斜角度(0-360)int angle = 30;//数值越大每页竖向水印越少int heightdensity = 20;//数值越大每页横向水印越少int widthdensity = 4;PdfUtils.addwaterMark(inputFile, outputFile, waterMarkName, opacity, fontsize, angle, heightdensity, widthdensity,false);fileName = UUID.randomUUID().toString() + "_" + fileName + ".pdf";String path = null;response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream");try {response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));} catch (UnsupportedEncodingException e2) {e2.printStackTrace();}byte[] buff = new byte[1024];BufferedInputStream bis = null;OutputStream os = null;try {path = "D:\\test";os = response.getOutputStream();bis = new BufferedInputStream(new FileInputStream(new File(path + "\\新建test(水印).pdf")));int i = bis.read(buff);while (i != -1) {os.write(buff, 0, buff.length);os.flush();i = bis.read(buff);}} catch (FileNotFoundException e1) {} catch (IOException e) {e.printStackTrace();return AjaxResult.error(e.getMessage());} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}}return AjaxResult.success();}/*** pdf加水印** @param fileName 文件名* @param response*/@PostMapping("/addPdfWaterMark")public AjaxResult addPdfWaterMark(String fileName, HttpServletResponse response) {try {
//            List<InputStream> pdfs = new ArrayList<InputStream>();
//            pdfs.add(new FileInputStream("e:\\123.pdf"));
//            pdfs.add(new FileInputStream("e:\\456.pdf"));
//            OutputStream output = new FileOutputStream("e:\\789.pdf");
//            concatPDFs(pdfs, output, true);PdfUtils.addPdfImgMark("D:\\test\\" + fileName,"D:\\test\\test(带图片水印).pdf","D:\\test\\水印图片.jpg",400, 1);PdfUtils.addPdfTextMark("D:\\test\\" + fileName,"D:\\test\\test(带文字水印).pdf", "测试水印", 300, 350);} catch (Exception e) {e.printStackTrace();return AjaxResult.error("系统错误");}return AjaxResult.success();}/*** pdf加密** @param fileName  文件名*/@PostMapping("/addEncryptionKey")public AjaxResult addEncryptionKey(String fileName) {PdfUtils.pdfEncrypt("D:\\test\\" + fileName, "D:\\test\\test(带图片水印已加密).pdf", "123456");return AjaxResult.success();}

Springboot使用itext及documents4j操作pdf(word转pdf、pdf加水印(文字或图片,可指定位置)、pdf加密(打开密码,编辑密码))相关推荐

  1. 咖啡汪日志——JAVA导出pdf文件加水印 文字+图片、文字

    咖啡汪日志--JAVA导出pdf文件加水印 文字和图片.文字 hello,又大家见面了! 作为一只不是在戏精就是在戏精路上的哈士奇,今天要展示给大家的就是如何快捷地给pdf文件增加各种水印.嗷呜呜,前 ...

  2. java pdf加水印 性能_利用java批量给pdf加水印的方法示例

    前言 最近因为工作需要,要批量在pdf上加水印,但找了一圈pdf在mac下的水印工具,都不太好用,索性就用java写一个吧. 以下代码依赖itext5.3.3包,java操作pdf 依靠itext5. ...

  3. 电脑上怎么做pdf文件_PDF文件怎么加水印?PDF水印添加方法

    有时候为了不让他人随意盗用我们PDF文件里的内容或图片,或者是出于宣传曝光的目的,我们可以通过给自己的PDF文件添加水印的方式来保护PDF文件里的内容.那么PDF文件怎么加水印?有什么方便的PDF水印 ...

  4. 【java spring boot使用easypoi实现word文档占位符替换文字和图片、Excel图片贴到对应单元格】

    最近接到一个任务,写两个导出工具:1.word文档导出,将数据和图片放入到word中,将多个word合并为一个导出.2.Excel文档导出,将二维码信息和图片按照模板放入到Excel中,按9个一页排版 ...

  5. QAxObject在Word 光标 或 标签 处插入文字、图片、表格、标题1等

    QAxObject操作word #插入word标题1级 2级 链接: [link](https://docs.microsoft.com/en-us/office/vba/api/word.wdbui ...

  6. python将图片插入word文件的指定位置,并转为pdf文件

    1.需求说明 现需要做一份数据报告,报告中只需插入少量图片,其他部分的文字和格式不变,需要将图片插入word文件的指定位置,并最终生成一份pdf报告.注意:是基于已有word文件插入图片,不是创建wo ...

  7. Java使用PDFBOX操作pdf文件(一,加载和创建pdf)

    前言: 之前想学习使用Java操作pdf的时候看过了IText的文档.确实IText的文档很全,也有一个官网可以很方便的查找信息.但IText的开源协议为AGPL,使用者必须传染性的开源代码,商业使用 ...

  8. python docx 合并文档 图片_python玩转pdf全攻略

    本篇说点轻松的,聊下Python对pdf的各种操作,包含pdf转word,pdf转图片等. pdf转换word文档 保留格式 pdf转换为word文档,被大众经常使用的是纯Python库pdfmine ...

  9. 怎么同时给多个 PDF 文档批量添加自定义的文字和图片水印

    概要:为了信息安全和版权保护,给 PDF 文档添加水印是非常重要且必要的.现在很多 PDF 的阅读器都带了添加水印的功能,能给实现给单个的 PDF 文档添加水印.但如果需要批量的给一些 PDF 添加水 ...

最新文章

  1. arduino灯光装置_用Arduino实现智能控制-夜间感应灯的制作
  2. centos 7手动更改源
  3. java之IO流(一)
  4. C++实现堆栈stack(附完整源码)
  5. windows系统上使用openssh client连接远程Linux服务器的日志分析
  6. 3.cocos2dx它Menu,由menu为了实现场景切换
  7. string与string.h的区别
  8. 4999元起!华为Mate 40今日开启预售:搭载麒麟9000E
  9. 仅需6道题轻松掌握Python时间和日期处理 | Python技能树征题
  10. ERNIE 3.0 | 刷榜了!60多项任务取得最好效果
  11. Unity创建字体库给TextMeshPro
  12. Kotlin教程,从入门到精通
  13. 杭州电子科技大学ACM-1096
  14. WindowsServer2003 2008R2架设ASP网站实战
  15. JAVA企业邮箱发送
  16. 数据分析案例(二手车)
  17. 学校计算机工作室制度,邵鹏飞计算机工作室2019-2020学年工作计划
  18. undefined reference to ‘cv::imread问题调查
  19. ITON - 1 论矩阵的妙用
  20. C++ STL 标准模板库介绍与入门

热门文章

  1. 【小程序与公众号】微信小程序九宫格抽奖(抽奖完全随机)
  2. 金融数据分析——DataJoy银行客户购买预测
  3. 安卓导航车机root方法_飞歌ES1互联网智能车机:一触即达已经OUT了!现在是一说即达...
  4. 飞鸽沟通软件2013最新版下载
  5. 联想在bios中怎么设置U盘启动
  6. 自我求生中的京东科技
  7. 二维正态分布的参数与概率密度图形
  8. [英语阅读]美国狗画家作品热销
  9. QLogic CTO看2016年的网络趋势
  10. 小灯泡自媒体博客Spimes4.6/收费typecho主题模板无加密无授权源码