Java使用PDFBox开发包实现对PDF文档内容编辑与保存

简介: Java使用PDFBox开发包实现对PDF文档内容编辑与保存

pdfbox开发包下载地址:http://pdfbox.apache.org/

程序实现了PDF文档的创建,读入,与修改PDF内容并保存。

可能有个前提,PDF文档不是加密的,如果加密怎么办,我没研究过!

源代码如下:

package com.gloomyfish.ups.pdf.reader;
 
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
 
import org.apache.pdfbox.cos.COSArray;
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.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.util.PDFOperator;
import org.apache.pdfbox.util.PDFTextStripper;
 
/**
 * http://pdfbox.apache.org/
 * 
 * @author fish
 * 
 */
public class PDFReader {
  
  public PDFReader()
  {
    createHelloPDF();
    readPDF();
    editPDF();
  }
 
  public void createHelloPDF() {
    PDDocument doc = null;
    PDPage page = null;
 
    try {
      doc = new PDDocument();
      page = new PDPage();
 
      doc.addPage(page);
      PDFont font = PDType1Font.HELVETICA_BOLD;
      PDPageContentStream content = new PDPageContentStream(doc, page);
      content.beginText();
      content.setFont(font, 12);
      content.moveTextPositionByAmount(100, 700);
      content.drawString("Hello");
 
      content.endText();
      content.close();
      doc.save("D:\\gloomyfish\\pdfwithText.pdf");
      doc.close();
    } catch (Exception e) {
      System.out.println(e);
    }
  }
  
  public void readPDF()
  {
    PDDocument helloDocument;
    try {
      helloDocument = PDDocument.load(new File(
          "D:\\gloomyfish\\pdfwithText.pdf"));
      PDFTextStripper textStripper = new PDFTextStripper();
      System.out.println(textStripper.getText(helloDocument));
      helloDocument.close();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  
  public void editPDF() {
     
    try {
      // pdfwithText
      PDDocument helloDocument = PDDocument.load(new File("D:\\gloomyfish\\pdfwithText.pdf"));
      // PDDocument helloDocument = PDDocument.load(new File("D:\\gloomyfish\\hello.pdf"));
      // int pageCount = helloDocument.getNumberOfPages();
      PDPage firstPage = (PDPage)helloDocument.getDocumentCatalog().getAllPages().get(0);
      // PDPageContentStream content = new PDPageContentStream(helloDocument, firstPage);
      PDStream contents = firstPage.getContents();
      
      PDFStreamParser parser = new PDFStreamParser(contents.getStream());  
            parser.parse();  
            List 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();  
                        string = string.replaceFirst("Hello", "Hello World, fish");  
                        //Word you want to change. Currently this code changes word "Solr" to "Solr123"  
                        previous.reset();  
                        previous.append(string.getBytes("ISO-8859-1"));  
                    }  
                    else if (op.getOperation().equals("TJ"))  
                    {  
                        COSArray previous = (COSArray) tokens.get(j - 1);  
                        for (int k = 0; k < previous.size(); k++)  
                        {  
                            Object arrElement = previous.getObject(k);  
                            if (arrElement instanceof COSString)  
                            {  
                                COSString cosString = (COSString) arrElement;  
                                String string = cosString.getString();  
                                string = string.replaceFirst("Hello", "Hello World, fish");  
                                
                                // Currently this code changes word "Solr" to "Solr123"  
                                cosString.reset();  
                                cosString.append(string.getBytes("ISO-8859-1"));  
                            }  
                        }  
                    }  
                }
            }
            // now that the tokens are updated we will replace the page content stream.  
            PDStream updatedStream = new PDStream(helloDocument);  
            OutputStream out = updatedStream.createOutputStream();  
            ContentStreamWriter tokenWriter = new ContentStreamWriter(out);  
            tokenWriter.writeTokens(tokens);  
            firstPage.setContents(updatedStream);  
            helloDocument.save("D:\\gloomyfish\\helloworld.pdf"); //Output file name  
            helloDocument.close();
//      PDFTextStripper textStripper = new PDFTextStripper();
//      System.out.println(textStripper.getText(helloDocument));
//      helloDocument.close();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (COSVisitorException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
 
  public static void main(String[] args) {
    new PDFReader();
  }
}
相关文章
|
9月前
|
XML 人工智能 Java
java实现PDF 电子签章
本文介绍了使用Java将Word文档转换为PDF并添加水印、签名和盖章的方法。通过Apache POI读取Word内容,结合OpenPDF生成PDF文件,并利用PdfPageEvent接口实现页面水印与签名功能。代码示例清晰展示了转换流程及关键实现细节。
623 0
|
12月前
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
7月前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
1093 0
|
10月前
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
236 4
|
12月前
|
安全 搜索推荐 iOS开发
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
703 8
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
人工智能 编解码 文字识别
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
OCRmyPDF 是一款开源命令行工具,专为将扫描的 PDF 文件转换为可搜索、可复制的文档。支持多语言、图像优化和多核处理。
1366 17
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
DeepSeek + Xmind,1分钟自动把pdf/word文档转成思维导图
DeepSeek与Xmind结合,1分钟将PDF、Word文档转换为思维导图。只需四步:上传文档至DeepSeek,请求转换为Markdown格式,保存文件并修改后缀为.md,最后导入Xmind生成思维导图。轻松驾驭复杂文档,适用于学习笔记、工作报告、项目规划等场景,大幅提升效率!
|
人工智能 文字识别 自然语言处理
1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!
Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。
1539 1
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!