700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Springboot使用itext及documents4j操作pdf(word转pdf pdf加水印(文字或图片 可指

Springboot使用itext及documents4j操作pdf(word转pdf pdf加水印(文字或图片 可指

时间:2023-08-04 00:21:12

相关推荐

Springboot使用itext及documents4j操作pdf(word转pdf pdf加水印(文字或图片 可指

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 mon.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=" + .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加密(打开密码 编辑密码))

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。