使用 Apache PDFBox 操作PDF文件

news2024/9/19 10:42:29

简介

Apache PDFBox库是一个用于处理PDF文档的开源Java工具。该项目允许创建新的PDF文档,操作现有PDF文档,并从PDF文档中提取内容。Apache PDFBox还包括几个命令行实用程序。

Apache PDFBox的主要功能如下:

  • 从PDF文件中提取Unicode文本。
  • 将单个PDF拆分成多个文件或合并多个PDF文件。
  • 从PDF表单中提取数据或填写PDF表单。
  • 验证PDF文件是否符合 PDF/A-1b 标准。
  • 使用标准的Java打印API打印PDF文件。
  • 将PDF另存为图像文件,例如PNG或JPEG。
  • 从头开始创建PDF,包括嵌入字体和图像。
  • 对PDF文件进行数字签名。

导入

首先,我们需要确保已经将PDFBox库添加到我的Java项目中。如果你使用的是maven,那么在pom.xml中添加如下依赖:

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

这里使用的版本是:2.0.28。

Talk is cheap. Show me the code.

创建PDF文档

我们可以使用以下代码创建一个简单的PDF文档:

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

public class CreatePDF {
    public static void main(String[] args) {
        PDDocument document = new PDDocument();
        PDPage page = new PDPage();
        document.addPage(page);
        
        PDType1Font font = PDType1Font.HELVETICA_BOLD;
        
        try {
            PDPageContentStream contentStream = new PDPageContentStream(document, page);
            contentStream.beginText();
            contentStream.setFont(font, 12);
            contentStream.newLineAtOffset(100, 700);
            contentStream.showText("Hello, World!");
            contentStream.endText();
            contentStream.close();
            
            document.save(new File("one-more.pdf"));
            document.close();
            
            System.out.println("PDF created successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个代码段创建一个新的PDF文档,并在其第一页上写入"Hello, World!"。我使用了Helvetica Bold字体,并将其大小设置为12。

接下来,我将文本显示在PDF页面上,并使用contentStream.close()方法关闭PDPageContentStream对象。

最后,我将文档保存为"one-more.pdf"文件,然后关闭PDDocument对象。效果如下图:

万猫学社

读取PDF文件

我们可以使用以下代码读取PDF文件中的全部内容:

import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

public class ReadPDFExample {
    public static void main(String[] args) {
        // 创建文件对象
        File file = new File("one-more.pdf");
        
        try {
            // 创建 PDF 文档对象
            PDDocument document = PDDocument.load(file);
            
            // 创建 PDF 文本剥离器
            PDFTextStripper stripper = new PDFTextStripper();
            
            // 获取 PDF 文件的全部内容
            String text = stripper.getText(document);
            
            // 输出 PDF 文件的全部内容
            System.out.println(text);
            
            // 关闭 PDF 文档对象
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

首先,创建一个文件对象,然后使用 PDDocument 类的静态方法 load() 加载 PDF 文件并创建一个 PDF 文档对象。

然后,我们创建一个 PDFTextStripper 对象,并使用它的 getText() 方法获取 PDF 文件的全部内容。

最后,我们输出 PDF 文件的全部内容,并关闭 PDF 文档对象。

输出内容就是之前我们写入的:

Hello, World!

插入图片

我们可以使用以下代码在PDF文件中插入图片:

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public class InsertImageInPDF {
    public static void main(String[] args) {
        try {
            // 加载PDF文件
            PDDocument document = PDDocument.load(new File("one-more.pdf"));

            // 获取第一页
            PDPage page = document.getPage(0);

            // 加载图像文件
            PDImageXObject image = PDImageXObject.createFromFile("one-more.jpg", document);

            // 在指定位置插入图像
            PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true, true);
            contentStream.drawImage(image, 200, 500, image.getWidth(), image.getHeight());

            // 关闭流
            contentStream.close();

            // 保存修改后的PDF文件
            document.save("one-more-jpg.pdf");

            // 关闭文档
            document.close();
            System.out.println("PDF created successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们加载了一个名为“one-more.pdf”的PDF文件,获取了第一页,并加载了一个名为“one-more.jpg”的图像文件。

然后,我们使用drawImage()方法在PDF文档中的指定位置插入了图像。

最后,我们将修改后的文档保存到名为“one-more-jpg.pdf”的新文件中,并关闭文档。效果如下图:

读取图片

我们可以使用以下代码在PDF文件中读取图片:

import java.io.IOException;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

public class ReadPDFImagesExample {

    public static void main(String[] args) {
        try {
            // 加载PDF文件
            PDDocument document = PDDocument.load(new File("one-more-jpg.pdf"));

            PDPageTree pageTree = document.getPages();

            // 遍历每个页面
            for (PDPage page : pageTree) {
                int pageNum = pageTree.indexOf(page) + 1;
                int count = 1;
                System.out.println("Page " + pageNum + ":");
                for (COSName xObjectName : page.getResources().getXObjectNames()) {

                    PDXObject pdxObject = page.getResources().getXObject(xObjectName);
                    if (pdxObject instanceof PDImageXObject) {
                        PDImageXObject image = (PDImageXObject) pdxObject;
                        System.out.println("Found image with width "
                                + image.getWidth()
                                + "px and height "
                                + image.getHeight()
                                + "px.");
                        String fileName = "one-more-" + pageNum + "-" + count + ".jpg";
                        ImageIO.write(image.getImage(), "jpg", new File(fileName));
                        count++;
                    }
                }
            }

            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在此示例中,我们使用PDDocument类从指定的PDF文件中加载文档,并遍历每个页面以查找其中的图像。

对于每个页面,我们获取其资源(包括图像)并检查其中是否存在图像。

如果存在,则我们遍历它们,并使用PDImageXObject对象获取它们的属性,例如宽度和高度。

然后,使用ImageIO把图片保存到本地文件系统。

输出如下:

Page 1:
Found image with width 150px and height 150px.

结尾

Apache PDFBox是一个功能强大的工具,除了以上的功能,还有许多其他功能值得我们去探索和发掘。如果你对Apache PDFBox有任何疑问或想了解更多功能,欢迎在评论区向我提问,或者直接访问官方网站:https://pdfbox.apache.org/。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术 倾斜摄影超大场景的三维模型轻量化的质量关键技术主要包括&#xff1a; 1、保持数据精度。在进行轻量化处理时&#xff0c;必须确保数据的精度不受损失&#xff0c;否则会影响后续分析和应用方案。因此&#xff0…

接口测试不再难。这篇文章让你在5分钟内掌握接口自动化测试用例

目录 摘要&#xff1a; 一、背景 二、测试用例设计 三、测试脚本实现 四、最佳实践和技巧 总结 摘要&#xff1a; 本文介绍了接口自动化测试的重要性&#xff0c;并提供了一个简单的测试用例&#xff0c;涵盖了设计、条件、步骤和数据方面的考虑。通过使用Python中的req…

C/C++|物联网开发入门+项目实战|函数输入与输出|值传递|地址传递|连续空间的传递|嵌入式C语言高级|C语言函数的使用(1)-学习笔记(11)

文章目录 函数概述输入参数示例&#xff1a;值传递地址传递连续空间的传递 参考&#xff1a; 麦子学院-嵌入式C语言高级-C语言函数的使用 函数概述 一堆代码的集合,用一个标签去描述它 复用化&#xff0c;降低冗余度 标签 ------ 函数名 函数和数组都属于内存空间&#xff0c…

C语言system讲解

‘system’是C语言标准库中的一个函数&#xff0c;它的作用是对计算机系统进行操作&#xff0c;如创建文件夹&#xff0c;打开文件夹&#xff0c;清空屏幕等等&#xff0c;下面介绍一下常用的几个system命令 system函数原型 int system(const char* command); command是字符…

联发科的好日子结束,出货量暴跌,高通稳住阵脚并开始反击

在手机芯片市场连续3年时间顺风顺水之后&#xff0c;联发科终于迎来了高通的反击&#xff0c;特别是骁龙8G2的发布更是导致联发科在手机芯片市场的步步后退&#xff0c;推动了高通的反弹。 一、形势有利于高通 高通此前的骁龙8G1和骁龙888因出现发热问题&#xff0c;因此被誉为…

4. 线性表

4. 线性表 线性表是最基本、最简单、也是最常用的一种数据结构(逻辑结构)。一个线性表是n个具有相同特性的数据元素的有限序列。 前驱元素&#xff1a; 若A元素在B元素的前面&#xff0c;则称A为B的前驱元素 后继元素&#xff1a; 若B元素在A元素的后面&#xff0c;则称B为…

【翻译一下官方文档】之uniapp的界面弹框交互

大致分 3 种 普通提示loading框弹出选项 我个人理解就是大致知道有些什么&#xff0c;有啥功能&#xff0c;用到的时候&#xff0c;直接去用&#xff0c;不会的回来翻看文档 uni.showToast(OBJECT) 参数类型必填说明平台差异说明titleString是提示的内容&#xff0c;长度与…

C++ 多态详解

目录 多态的概念 定义 C直接支持多态条件 举例 回顾继承中遇到的问题 虚函数-虚函数指针-虚函数列表 虚函数 虚函数指针 虚函数列表 虚函数调用流程 虚函数于普通成员函数的区别 多态的概念 定义 多态&#xff1a;相同的行为方式导致了不同的行为结果&#xff0c;同一行…

【翻译一下官方文档】之uniapp的.sync修饰符

先用一个案例引出.sync修饰符 就是这样一个场景 父组件直接修改状态A当然没问题&#xff0c;但是子组件不能直接修改状态A&#xff0c;因为单向数据流限制 单向数据流 uni-app官网 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定&#xff1a;父级 prop 的更新会…

AFP vs SMB vs NFS: 谁是最好的数据传输协议?

目录 SMB: 什么是SMB 协议&#xff1f; NFS: 什么是NFS协议? AFP: 设么是AFP协议&#xff1f; 如何选择合适的传输协议&#xff1f; 场景1: 大型企业 场景2: 小型网站设计公司 场景3&#xff1a; Linux软件开发组 可以在互联网上使用这些协议吗? AFP vs SMB vs NFS …

Docker的安装和镜像容器的基本操作

Docker的安装和镜像容器的基本操作 Docker 概述Docker与虚拟机的区别namespace的六项隔离Docker核心概念 安装 DockerDocker 镜像操作搜索镜像获取镜像镜像加速下载查看镜像信息查看下载的镜像文件信息查看下载到本地的所有镜像根据镜像的唯一标识 ID 号&#xff0c;获取镜像详…

基于struts + spring + hibernate的题库与试卷管理系统源码

3需求分析和设计方案 3.1 题库管理 3.1.1 试题管理需求分析 试题管理是整个系统非常核心的模块&#xff0c;它基于知识点模块、章节模块、课程模块、题型管理模块完成的基础上的。其中核心元素是试题&#xff0c;通过试题将题库中的各模块连接起来。 试题管理分为题库录入和…

MyBatisPlus学习

官网&#xff1a;https://mp.baomidou.com/ MyBatis Plus&#xff0c;简化 MyBatis &#xff01; 1.概述 需要的基础&#xff1a;把我的MyBatis、Spring、SpringMVC就可以学习这个了&#xff01; 为什么要学习它呢&#xff1f;MyBatisPlus可以节省我们大量工作时间&#xff0…

随机模型预测控制(SMPC)——考虑概率约束(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 模型预测控制&#xff08;MPC&#xff09;又称为滚动时域控制和滚动时域控制&#xff0c;是一种强有力的工程应用技术。MPC的价…

springboot +flowable,处理 flowable 的用户和用户组(一)

一.简介 对于flowable是什么以及关于此框架的具体信息可以参看此项目的官方文档&#xff1a;https://www.flowable.org/docs/userguide/index.html Flowable is a light-weight business process engine written in Java.这是官网文档对此框架的完美解释&#xff1a;Flowable…

AIGC技术周报|清华、北邮新研究:让文生图AI更懂你

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 OpenAGI&#xff1a;当大模型遇见领域专家 “愿原力与大型…

ctfshow_WEB_web2 wp

前言 写这个是因为。。。我想摆烂&#xff0c;就去从最简单的题开始做了&#xff0c;想着交一道题是一道嘛&#xff0c;总之觉得这样做很适合欺骗安慰自己&#xff08;逃 然后我发现我错了&#xff0c;我第二道题就做了好久还没做出来&#xff0c;甚至最后去点开了hint…… ps…

多数据源事务

使用 DATASOURCE 模式后&#xff0c;可能一个操作涉及到多个数据源。例如说&#xff1a;创建租户时&#xff0c;即需要操作主库&#xff0c;也需要操作租户库。 考虑到多数据的数据一致性&#xff0c;我们会采用事务的方式&#xff0c;而使用 Spring 事务时&#xff0c;会存在…

FTP服务--文件传输协议

FTP服务--文件传输协议 一、FTP服务端口二、FTP服务主动模式与被动模式三、FTP服务配置方法设置匿名用户访问的FTP服务(最大权限)配置文件中常见字段的含义 一、FTP服务端口 FTP服务器默认使用TCP协议的20,21端口与客户端进行通信 20端口&#xff1a;用于建立数据连接&#x…

GDB调试的基本使用、GDB调试多进程

1. 编译时加选项-g&#xff0c;生成具有调试信息的程序 gcc -g test.c -o test 2. 启动GDB &#xff08;1&#xff09;启动GDB&#xff1a; gdb test &#xff08;2&#xff09;设置运行时参数&#xff1a;&#xff08;主函数中可接收运行时参数&#xff09; set args //…