Java操作PDF(快速入门)

  • 简介:
  • 环境
  • 1.创建一个空白pdf文档
  • 1.1批量添加PDF的空白页
  • 2. 加载一个现有的PDF文档
  • 3.删除PDF文档的页面
  • 4.给PDF文档设置属性
  • 5.给PDF文档添加文本
  • 5.1添加多行文本
  • 6.从现有的PDF文档提取数据
  • 7.将图片插入到PDF文档里
  • 8.给PDF文档加密
  • 9.向PDF写入JavaScript脚本
  • 10.拆分PDF文档页面
  • 11.合并多个PDF
  • 12.将PDF生成图片
  • 13.在PDF文档中创建一个矩形


简介:

Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换。 在本教程中,我们将学习如何使用PDFBox开发可以创建,转换和操作PDF文档的Java程序。

环境

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.15</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox-tools</artifactId>
    <version>2.0.15</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.15</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>preflight</artifactId>
    <version>2.0.15</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>xmpbox</artifactId>
    <version>2.0.15</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging-api</artifactId>
    <version>1.1</version>
</dependency>

或者添加以下jar包 pdfbox-2.0.15.jar,fontbox-2.0.15.jar,preflight-2.0.15.jar,xmpbox-2.0.15.jar,pdfbox-tools-2.0.15.jar,junit-4.10.jar,commons-logging-1.1.jar

1.创建一个空白pdf文档

我们可以通过实例化PDDocument类来创建空PDF文档。 您可以使用Save()方法将文档保存在所需的位置,最后别忘记关闭文档close();

/**
     * 创建一个空白pdf
     */
    @Test
    public void Test2() throws IOException {
        //1创建一个空的pdf
   		PDDocument document = new PDDocument();
        //2创建一个空白页
        PDPage page = new PDPage();
        //3向文档添加一个空白页
        document.addPage(page);
   		//4保存文档路径
        document.save("C:\Users\jiang\Desktop\1.pdf");
  		//5关闭文档
        document.close();
}

1.1批量添加PDF的空白页

/**
     * 批量添加空白页
     */
    @Test
    public void Test2() throws IOException {
      	//1创建一个空的pdf
   		PDDocument document = new PDDocument();
   		//批量创建空白页
        for (int i = 0; i < 10; i++) {
        //2创建一个空白页
        PDPage page = new PDPage();
        //3向文档添加一个空白页
        document.addPage(page);
    }
    //4保存文档路径
        document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
    //5关闭文档
        document.close();
}

2. 加载一个现有的PDF文档

我们通过PDDocument类的load()方法用于加载现有PDF文档。

/**
     * 加载一个现有的pdf
     */
    @Test
    public void Test3() throws IOException {
        //1加载现有的pdf
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        //2加载pdf
        PDDocument document  = PDDocument.load(file);
        //3加入一个空白页面
        document.addPage(new PDPage());
        //4重新保存一个路径
        document.save("C:\\Users\\jiang\\Desktop\\2.pdf");
        //5关闭文档
        document.close();
    }

3.删除PDF文档的页面

我们可以使用PDDocument类的removePage()方法从现有PDF文档中删除页面。

/**
     * 从文档中删除页面
     */
    @Test
    public void Test4() throws IOException {
        //1加载现有的pdf
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        PDDocument document = PDDocument.load(file);
        //2列出页数
        int nofPages = document.getNumberOfPages();
        System.out.println("总页数为:"+nofPages);
        //3删除页面(使用PDDocument类的removePage()方法从pdf里删除页面)
        document.removePage(1);
        //4删除后保存
        document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
        //5关闭文档
        document.close();
    }

4.给PDF文档设置属性

与其他文件一样,PDF文档也具有文档属性。这些属性是键值对。每个属性都提供有关该文档的特定信息。

PDF文档的属性

编号

描述

1

(File) 此属性保存文件的名称。

2

(Title)使用此属性,您可以设置文档的标题。

3

(Author)使用此属性,您可以设置文档的作者姓名。

4

(Subject)使用此属性,您可以指定PDF文档的主题。

5

(Keywords)使用此属性,您可以列出我们可以搜索文档的关键字。

6

(Created)使用此属性,您可以设置为文档创建的日期。

7

(Modified)使用此属性,您可以设置为文档修改的日期。

8

(Application)使用此属性,您可以设置文档的应用程序。。

/**
     * 设置PDF的属性
     */
    @Test
    public void Test5() throws IOException {
        //1创建一个pdf
        PDDocument document = new PDDocument();
        //2创建一个空白的页面
        PDPage page = new PDPage();
        //3把页面添加到pdf里
        document.addPage(page);
        //4创建一个PDDocumentInformation()对象来给文档添加属性
        PDDocumentInformation pdd = new PDDocumentInformation();
            //设置作者
            pdd.setAuthor("PDFAuthor");
            //设置头部的名字
            pdd.setTitle("PDFTitle");
            //设置创作者
            pdd.setCreator("PDFCreator");
            //设置主题
            pdd.setSubject("PDFSubject");
            //创建时间
            Calendar data = new GregorianCalendar();
            data.set(2020,6,18);
            pdd.setCreationDate(data);
            //修改时间
            data.set(2020,6,20);
            pdd.setModificationDate(data);
            //文档的关键字
            pdd.setKeywords("PDFKeywords");

        //5保存文档
        document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
        //6获取文档的属性
        System.out.println("获取到的作者:"+pdd.getAuthor()+"\n获取到的主题:"+pdd.getSubject());
        //6关闭文档
        document.close();
    }

我们可以通过set()方法来给文档的属性赋值,通过get()方法来获取文档的属性值。

5.给PDF文档添加文本

我们可以使用PDPageContentStream的类,其中包含在PDFDocument的页面中插入文本,图像和其他类型内容所需的方法。

/**
     * 给pdf添加文本
     */
    @Test
    public void  Test6() throws IOException {
        //1加载pdf
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        PDDocument document = PDDocument.load(file);

        //2获取页面
        PDPage page = document.getPage(0);

        //3 准备内容流
        PDPageContentStream contentStream = new PDPageContentStream(document,page);

        //4开始文本
        contentStream.beginText();//起始文本
        	//加载本机字体
        	PDFont font = PDType0Font.load(document, new File("C:\\Windows\\Fonts\\simkai.ttf"));
      	    contentStream.setFont(font,12);//设置字体
      	    contentStream.newLineAtOffset(25,700);//设置文本位置
       	    String text = "这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是!";
       	 	contentStream.setLeading(15.5f);//设置文本的前导
        	contentStream.showText(text);//写入到PDF文档里
        	contentStream.endText();//结束文本

        //5关闭内容流
        contentStream.close();
        
        //6保存PDF位置
        document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
     
        //7关闭文档
        document.close();
    }

5.1添加多行文本

为了向PDF添加多行,我们需要使用setLeading()方法设置前导,并在完成每一行后使用newline()方法切换到新行。

/**
     * 给pdf添加文本
     */
    @Test
    public void  Test6() throws IOException {
        //1加载pdf
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        PDDocument document = PDDocument.load(file);

        //2获取页面
        PDPage page = document.getPage(0);

        //3 准备内容流
        PDPageContentStream contentStream = new PDPageContentStream(document,page);

        //4开始文本
        contentStream.beginText();//起始文本
        //加载本机字体
        PDFont font = PDType0Font.load(document, new File("C:\\Windows\\Fonts\\simkai.ttf"));
        contentStream.setFont(font,12);//设置字体
        contentStream.newLineAtOffset(25,700);//设置文本位置
        String text = "这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是!";
        String text2 = "换行了!换行了!换行了!换行了!换行了!换行了!换行了!换行了!换行了!换行了!";

        contentStream.setLeading(15.5f);//设置文本的前导


        contentStream.showText(text);
        contentStream.newLine();//使用换行将他们分开
        contentStream.showText(text2);

        contentStream.endText();//结束文本

        //5关闭内容流
        contentStream.close();
        //6保存PDF位置
        document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
        //7关闭文档
        document.close();
    }

6.从现有的PDF文档提取数据

我们可以使用PDFTextStripper类的getText()方法提取文本。 此类提取给定PDF文档中的所有文本。

/**
     * 从现有的PDF中提取文本
     */
    @Test
    public void Test7() throws IOException {
        //1加载现有的pdf
        File file = new File("C:\\Users\\jiang\\Desktop\\000.pdf");
        PDDocument document = PDDocument.load(file);
        //2实例化PDFTextStripper
        PDFTextStripper stripper = new PDFTextStripper();
        //3检索文本
        String text = stripper.getText(document);
        System.out.println("数据是:\n"+text);
        //4关闭文件
        document.close();

7.将图片插入到PDF文档里

我们可以分别使用PDImageXObject和PDPageContentStream类的createFromFile()和drawImage()方法将图像插入PDF文档。

/**
     * 将图片插入到pdf
     */
    @Test
    public void test8() throws IOException {
        //1获取现有的pdf
        File file = new File("C:\\Users\\jiang\\Desktop\\2.pdf");
        PDDocument document = PDDocument.load(file);

        //2获取页面
        PDPage page = document.getPage(0);

        //3创建PDImageXObject对象来进行获取图片进行设置
        PDImageXObject pdImage = PDImageXObject.createFromFile("C:\\Users\\jiang\\Desktop\\1.jpg",document);

        //4准备内容流
        PDPageContentStream contentStream = new PDPageContentStream(document,page);

        //5在pdf中绘制图片位置及宽高
        contentStream.drawImage(pdImage,80f,250f,500f,500f);

        //养成好习惯用完保存关闭
        //6关闭PDPageContentStream
        contentStream.close();
        //7保存文档
        document.save("C:\\Users\\jiang\\Desktop\\2.pdf");
        //8关闭文件
        document.close();
    }

8.给PDF文档加密

我们可以使用StandardProtectionPolicy和AccessPermission classes提供的方法加密PDF文档。

AccessPermission类用于通过为其分配访问权限来保护PDF文档。 使用此类,您可以限制用户执行以下操作。

  • 打印文档
  • 修改文档的内容
  • 复制或提取文档的内容
  • 添加或修改注释
  • 填写交互式表单字段
  • 提取文本和图形,以便为视障人士提供便利
  • 组装文档

StandardProtectionPolicy类用于向文档添加基于密码的保护。

/**
     * 加密pdf
     */
    @Test
    public void test9() throws IOException {
        //1加载Pdf文档
        File file = new File("C:\\Users\\jiang\\Desktop\\2.pdf");
        PDDocument document = PDDocument.load(file);

        //2创建访问对象
        AccessPermission accessPermission = new AccessPermission();

        //3创建StandardProtectionPolicy对象
        //用来传递所有者密码,用户名密码和AccessPermission对象来实例化StandardProtectionPolicy类
        StandardProtectionPolicy spp = new StandardProtectionPolicy("123","123",accessPermission);
        spp.setEncryptionKeyLength(128);//设置加密密钥长度
        spp.setPermissions(accessPermission);//设置权限

        //4保护文档
        document.protect(spp);

        //5保存文档
        document.save("C:\\Users\\jiang\\Desktop\\2.pdf");

        //6关闭文档
        document.close();
    }

9.向PDF写入JavaScript脚本

我们可以使用PDActionJavaScript类将JavaScript操作添加到PDF文档。 这表示JavaScript操作。

/**
     * 震惊PDF里竟然可以写javascript脚本
     */
    @Test
    public void test10() throws IOException {
        //1首先来到操作文件的万年第一步加载文件
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        PDDocument document = PDDocument.load(file);

        //2接下来我们把PDActionJavaScript对象创建出来
        String javascript = "app.alert( {cMsg: '这是一个消息弹框,具体没有什么用。', nIcon: 1,"
                + " nType: 0,cTitle: '我来测试一下javaScript!!' } );";
        PDActionJavaScript script = new PDActionJavaScript(javascript);

        //3然后我们把javascript脚本放到pdf文档里
        document.getDocumentCatalog().setOpenAction(script);

        //4最后要养成好习惯保存关闭文档
        document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
        document.close();
    }

10.拆分PDF文档页面

我们可以使用名为Splitter的类将给定的PDF文档拆分为多个PDF文档。 此类用于将给定的PDF文档拆分为多个其他文档。

/**
     * 拆分PDF文档的页面
     */
    @Test
    public void test11() throws IOException {
        //1加载pdf文件
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        PDDocument document = PDDocument.load(file);

        //2实例化Splitter类
        Splitter splitter =new Splitter();

        //3拆分PDF页面
        List<PDDocument> pages = splitter.split(document);

        //4创建迭代器
        Iterator<PDDocument> iterator = pages.listIterator();
        
        //5循环进行拆分
        int i = 1;
        while(iterator.hasNext()) {
            PDDocument pd = iterator.next();
            pd.save("C:\\Users\\jiang\\Desktop\\"+i+"1.pdf");
        }

        //5关闭文档
        document.close();
    }

11.合并多个PDF

我们可以使用名为PDFMergerUtility类的类将多个PDF文档合并到一个PDF文档中,此类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。

/**
     * 合并多个PDF
     */
    @Test
    public void test12() throws IOException {
        //1加载pdf文件(这里加载了两个PDf进行合并)
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        File file1 = new File("C:\\Users\\jiang\\Desktop\\21.pdf");
        PDDocument document = PDDocument.load(file);
        PDDocument document1 = PDDocument.load(file1);
        
        //2实例化PDFMergerUtility类
        PDFMergerUtility pdfMerger = new PDFMergerUtility();

        //3设置目标文件
        pdfMerger.setDestinationFileName("C:\\Users\\jiang\\Desktop\\3.pdf");

        //4设置源文件
        pdfMerger.addSource(file);
        pdfMerger.addSource(file1);

        //5合并文档
        pdfMerger.mergeDocuments();

        //6关闭文档
        document.close();
    }

12.将PDF生成图片

PDFBox库为您提供了一个名为PDFRenderer的类, PDFRenderer PDF文档呈现为AWT BufferedImage。

/**
     * 将pdf文件生成图像
     */
    @Test
    public void test13() throws IOException {
        //1加载pdf文件
        File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
        PDDocument document = PDDocument.load(file);
        
        //2实例化PDFRenderer对象
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        
        //3从PDF文档渲染图像
        BufferedImage image = pdfRenderer.renderImage(0);//设置读第几页默认下标从0开始
        
        //4将图像写入文件
        ImageIO.write(image,"jpg",new File("C:\\Users\\jiang\\Desktop\\1.jpg"));
        
        //5关闭文档
        document.close();
    }

13.在PDF文档中创建一个矩形

我们可以使用PDPageContentStream类的addRect()方法在PDF页面中添加矩形框。

/**
     * 在PDF里创建一个矩形
     */
    @Test
    public void test14() throws IOException {
        //1加载pdf文件
        File file = new File("C:\\Users\\jiang\\Desktop\\21.pdf");
        PDDocument document = PDDocument.load(file);
        //2获取页面对象
        PDPage page = document.getPage(0);
        //3准备内容流
        PDPageContentStream stream = new PDPageContentStream(document,page);
        
        //4设置颜色
        stream.setNonStrokingColor(Color.blue);

        //5绘制矩形
        stream.addRect(200, 650, 100, 100);
        
        //6填充矩形
        stream.fill();
        
        //7关闭流
        stream.close();
        //8保存文档位置
        document.save("C:\\Users\\jiang\\Desktop\\21.pdf");
        //9关闭文档
        document.close();

    }