java remove pdf watermark Java去除PDF水印

import org.apache.pdfbox.cos.COSString; import org.apache.pdfbox.exceptions.COSVisitorException; import org.apache.pdfbox.pdfparser.PDFStreamParser; import org.apache.pdfbox.pdfwriter.ContentStreamWriter; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.util.PDFOperator; /** * * * <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>1.8.3</version> </dependency> * @author Cloud-Top * */ public class PdfUtil { public static void main(String[] args) { removePdfWatermark("C:\\Users\\Cloud-Top\\eclipse-workspace\\demo\\src\\main\\resources\\watermark_pdf\\1629680832866.pdf", "C:\\Users\\Cloud-Top\\1629680832866.pdf"); } /** * * @param sourPath 原pdf * @param savePath 新pdf */ @SuppressWarnings("unchecked") public static void removePdfWatermark(String sourPath ,String savePath) { try { //读取源文件 PDDocument helloDocument = PDDocument.load(new File(sourPath)); List<PDPage> allPages = helloDocument.getDocumentCatalog().getAllPages(); for(PDPage pdPage : allPages) { PDStream contents = pdPage.getContents(); PDFStreamParser parser = new PDFStreamParser(contents.getStream()); parser.parse(); List<Object> tokens = parser.getTokens(); for (int j = 0; j < tokens.size(); j++) { Object next = tokens.get(j); if (next instanceof PDFOperator) { PDFOperator op = (PDFOperator) next; // Tj and TJ are the two operators that display strings in a PDF if (op.getOperation().equals("Tj")) { // Tj takes one operator and that is the string // to display so lets update that operator COSString previous = (COSString) tokens.get(j - 1); String string = previous.getString(); System.out.println(string); //需要解决乱码 //有效期至 == eHgó if(string.contains("eHgó")) { //清空匹配上的内容 previous.reset(); } } } } PDStream updatedStream = new PDStream(helloDocument); OutputStream out = updatedStream.createOutputStream(); ContentStreamWriter tokenWriter = new ContentStreamWriter(out); tokenWriter.writeTokens(tokens); pdPage.setContents(updatedStream); } //Output file name helloDocument.save(savePath); helloDocument.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (COSVisitorException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

__EOF__

本文作者Immortal-mode
本文链接https://www.cnblogs.com/immortal-mode/p/15204796.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   immortal_mode  阅读(2844)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示