PDF添加二维码
package com.xuebusi.toutiao.admin.api.common.util; import com.itextpdf.text.BaseColor; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.*; import java.io.*; public class WaterMarkUtils { /** * PDF附件添加二维码 * * @param bos 输出文件的位置 * @param input 输入文件流 * @author nicky.ma * @date 2019年6月11日下午3:42:15 */ public static void setQrCodeForPDF(BufferedOutputStream bos, InputStream input) { try { // 创建水印图片 BarcodeQRCode barcodeQRCode = new BarcodeQRCode("https://sina.cn", 100, 100, null); com.itextpdf.text.Image iTextImage = barcodeQRCode.getImage(); // 水印图片位置 iTextImage.setAbsolutePosition(10, 740); // 边框固定 // iTextImage.scaleToFit(200, 200); // 设置旋转弧度 //image.setRotation(30);// 旋转 弧度 // 设置旋转角度 // iTextImage.setRotationDegrees(45); // 设置等比缩放 iTextImage.scalePercent(80); // 自定义大小 iTextImage.scaleAbsolute(100, 100); //PDF附件加上二维码水印 setWatermarkForPDF(bos, input, iTextImage); } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } } /** * 为PDF附件添加图片水印 * * @param bos 输出文件的位置 * @param input 输入文件流 * @author nicky.ma * @date 2019/6/11 12:00:32 */ public static void setWatermarkForPDF(BufferedOutputStream bos, InputStream input, Image iTextImage) throws IOException, DocumentException { PdfReader reader = new PdfReader(input); PdfStamper stamper = new PdfStamper(reader, bos); int total = reader.getNumberOfPages() + 1; PdfContentByte waterMar; PdfGState gs = new PdfGState(); long startTime = System.currentTimeMillis(); System.out.println("PDF加图片水印 start"); for (int i = 1; i < total; i++) { // waterMar = stamper.getOverContent(i);// 在内容上方加水印 waterMar = stamper.getUnderContent(1);//在内容下方加水印 // 设置图片透明度为0.2f //gs.setFillOpacity(0.2f); // 设置笔触字体不透明度为0.4f //gs.setStrokeOpacity(0.4f); // 开始水印处理 waterMar.beginText(); // 设置透明度 waterMar.setGState(gs); // 设置水印字体参数及大小 BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED); waterMar.setFontAndSize(bf, 12); // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度 waterMar.showTextAligned(Element.ALIGN_CENTER, "存证证书", 60, 725, 0); // 设置水印颜色 waterMar.setColorFill(BaseColor.GRAY); // 附件加上水印图片 waterMar.addImage(iTextImage); // 完成水印添加 waterMar.endText(); // stroke waterMar.stroke(); } long endTime = System.currentTimeMillis(); System.out.println("PDF加图片水印 ok 所用时间:" + (endTime - startTime) + "s"); stamper.close(); reader.close(); } public static void main(String[] args) throws FileNotFoundException { FileInputStream inputStream = new FileInputStream(new File("D:\\2021-07-29.pdf")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\20210729.pdf")); WaterMarkUtils.setQrCodeForPDF(bos, inputStream); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架