掌握iText:轻松处理PDF文档-进阶篇

简体中文写入

iText本身对简体中文的支持有限,但可以通过引入额外的字体包来增强其对简体中文的支持。例如,可以使用iTextAsian.jar这个亚洲字体包,它包含了几种简单的亚洲字体,其中包括简体中文字体。只需要将iTextAsian.jar放到类路径下,并在报表文件中设置相应的字体,就能够正常显示中文信息。如果想要使用其他的自定义的字体,则需要进行相应的扩展。

第一种:使用iTextAsian.jar中的简体中文字体

@Test
public void test8() {
    Font font = FontFactory.getFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED, 12, Font.NORMAL);
    Document document = new Document();
    try {
        PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello.pdf"));
        document.open();
        document.add(new Paragraph("白日依山尽,黄河入海流。", font));
        document.add(new Paragraph("欲穷千里目,更上一层楼。", font));
        document.close();
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

第二种:自定义字体

  1. 下载字体:从字体天下网下载一个字体,需要注意的是在商业应用中版权问题,就下载这个吧,看着不错;

  1. 使用自定义的字体也很简单,即在使用字体之前要先注册一下,注册完成后就可以使用了。
@Test
public void test9() {
    URL resource = getClass().getClassLoader().getResource("HongLeiXingShuJianTi-2.otf");
    FontFactory.register(resource.getPath(), "HongLeiXingShuJianTi-2.otf");
    Font font = FontFactory.getFont("HongLeiXingShuJianTi-2.otf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 20, Font.NORMAL);
    Document document = new Document();
    try {
        PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello.pdf"));
        document.open();
        document.add(new Paragraph("白日依山尽,黄河入海流。", font));
        document.add(new Paragraph("欲穷千里目,更上一层楼。", font));
        document.close();
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

读取文本和图片

iText并没有直接从pdf中提取图片的api,但这并不代表不能提取图片,可以这样做

读取目标文档截图:

步骤

  1. 定义一个pdf阅读器;
  2. 再定义一个pdf内容解析器,构造方法接受一个pdf阅读器作为参数;
  3. 逐行进行内容解析,这里需要实现RenderListener接口,RenderListener接口有两个重要方法:renderText()和renderImage()

renderText(TextRenderInfo renderInfo): 这个方法在文本渲染时被调用。TextRenderInfo对象包含了关于文本渲染的所有信息,包括文本、字体、颜色等等。你可以通过这个方法来控制文本的渲染方式,例如设置文本的颜色、字体等。

renderImage(ImageRenderInfo renderInfo): 这个方法在图像渲染时被调用。ImageRenderInfo对象包含了关于图像渲染的所有信息,包括图像的路径、宽度和高度等。你可以通过这个方法来控制图像的渲染方式,例如设置图像的大小、位置等。

@Test
public void test10() {
    try {
        PdfReader pdfReader = new PdfReader(new FileInputStream("d:/test/hello.pdf"));
        int numberOfPages = pdfReader.getNumberOfPages();
        PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader);
        for (int i = 0; i < numberOfPages; i++) {
            int finalI = i;
            parser.processContent(i + 1, new RenderListener() {
                @Override
                public void beginTextBlock() {
                }

                @Override
                public void renderText(TextRenderInfo renderInfo) {
                    System.out.println("---start text---");
                    String text = renderInfo.getText();
                    System.out.println(text);
                    System.out.println("---end text---");
                }

                @Override
                public void endTextBlock() {
                }

                @Override
                public void renderImage(ImageRenderInfo renderInfo) {
                    System.out.println("---start image---:");
                    PdfImageObject image = null;
                    try {
                        image = renderInfo.getImage();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    byte[] imageAsBytes = image.getImageAsBytes();
                    String fileType = image.getFileType();
                    String imageName = "d:/test/" + (finalI + 1) + "." + fileType;
                    FileUtil.writeBytes(imageAsBytes, imageName);
                    System.out.println("imageName:" + imageName);
                    System.out.println("---end image---");
                }
            });
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

总结

注意:目标文档中,先是两行文本内容,然后才是一张图片。但是从提取日志来看,先提取出来的是图片,然后才是文本内容,因此,这里虽然可以从pdf中提取到图片,但是图片和文本的顺序是不能保证的,需要特别注意哦。

读取表格

读取目标文档截图:

很遗憾,使用iText从pdf文档中读取表格内容,并没有像poi读取word中表格一样,可以逐行读取的API,读取表格内容和读取文本是一样的,不能读取出表格的样式内容。如图:

上一篇:掌握iText:轻松处理PDF文档-基础篇-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Star CCM+ 停止并保存用命令行运行的计算

在 StarCCM 命令行运行 中介绍了命令行运行计算的方法&#xff0c;有网友询问停止计算的命令&#xff0c;但计算一旦提交之后应该是不能用命令结束的&#xff0c;除非是用 kill 或任务管理器直接结束进程。然而&#xff0c;直接结束进程不会自动保存计算结果。 问题 通常情况下…

tidb安装 centos7单机集群

安装 [rootlocalhost ~]# curl --proto https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh [rootlocalhost ~]# source .bash_profile [rootlocalhost ~]# which tiup [rootlocalhost ~]# tiup playground v6.1.0 --db 2 --pd 3 --kv 3 --host 192.168.1…

【C++】C++中的String类详解及模拟实现示例

文章目录 string类简介string类的基本用法string类的常用方法string类的优势 string类的模拟实现存储结构头文件string.h源文件string.cpp源文件test.cpp string类简介 string类简介在C编程中&#xff0c;字符串是一种非常常见的数据类型&#xff0c;用于存储文本信息。C标准库…

用 Python 自动创建 Markdown 表格

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Markdown表格是文档中整理和展示数据的重要方式之一。然而&#xff0c;手动编写大型表格可能会费时且容易出错。本文将介绍如何使用Python自动创建Markdown表格&#xff0c;通过示例代码详细展示各种场景下的创建…

Java 何时会触发一个类的初始化

Java 何时会触发一个类的初始化&#xff1f; 使用new关键字创建对象访问类的静态成员变量 或 对类的静态成员变量进行赋值调用类的静态方法反射调用类时&#xff0c;如 Class.forName()初始化子类时&#xff0c;会先初始化其父类&#xff08;如果父类还没有进行过初始化的话&a…

【Java】I/O流—File类:从0到1的全面解析

&#x1f38a;专栏【Java】 &#x1f33a;每日一句:看不清楚未来时,就比别人坚持久一点 ⭐欢迎并且感谢大家指出我的问题 目录 1.File概述 2.File构造方法 (1).根据文件路径创建文件对象 (2).根据父路径名字符串和子路径名字符串创建对象 (3).根据父路径对应文件对象和子路…

关于性能测试,你不知道的事应用性能监控:SkyWalking

SkyWalking 简介 SkyWalking 是一款优秀的 APM 工具&#xff08;Application Performance Monitoring&#xff0c;应用性能监控&#xff09;&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8S、Mesos&#xff09;的架构而设计&#xff0c;包含了分布式追踪…

14-1、IO流

14-1、IO流 lO流打开和关闭lO流打开模式lO流对象的状态 非格式化IO二进制IO读取二进制数据获取读长度写入二进制数据 读写指针 和 随机访问设置读/写指针位置获取读/写指针位置 字符串流 lO流打开和关闭 通过构造函数打开I/O流 其中filename表示文件路径&#xff0c;mode表示打…

【PWN】学习笔记(二)【栈溢出基础】

课程教学 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 C语言函数调用栈 一个栈帧保存的是一个函数的状态信息&…

前端mp3文件转wav文件的实现

一、音频文件格式转换 1&#xff09;安装fluent-ffmpeg和ffmpeg插件 npm install fluent-ffmpeg; npm install ffmpeg;2&#xff09;mp3转wav test.js文件&#xff1a; const ffmpeg require(fluent-ffmpeg);ffmpeg(./test.mp3) .format(wav) .audioBitrate(16k) .audioFre…

Shutter的安装及使用

概要&#xff1a;本篇主要讲述截图软件Shutter的安装和使用&#xff0c;操作系统是Ubuntu22.04 一、安装 sudo apt install shutter 二、区域截图 1、打开Shutter&#xff0c;点击Selection 2、提示信息 3、框选矩形区域 按住鼠标左键&#xff0c;拖动鼠标&#xff0c;松…

基于SSM的健身房预约系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

@Styles和@Extend的区别(鸿蒙开发)

如果每个组件的样式都需要单独设置&#xff0c;在开发过程中会出现大量代码在进行重复样式设置&#xff0c;虽然可以复制粘贴&#xff0c;但为了代码简洁性和后续方便维护&#xff0c;我们推出了可以提炼公共样式进行复用的装饰器Styles。 Styles装饰器可以将多条样式设置提炼成…

模型 心流

本系列文章 主要是 分享模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。完全投入其中。 1 心流的应用 1.1 优秀运动员的心流体验 迈克尔乔丹&#xff08;Michael Jordan&#xff09;&#xff1a;篮球之神乔丹在比赛中经常进入心流状态&#xff0c;他曾表示&#xff…

Java_LinkedList链表详解

目录 前言 ArrayList的缺陷 链表 链表的概念及结构 链表的种类 1.单向或双向 2.带头或不带头 3.循环或不循环 LinkedList的使用 什么是LinkedList LinkedList的使用 LinkedList的构造 LinkedList的其他常用方法介绍 LinkedList的遍历 ArrayList和LinkedList的…

1833_emacs_smex的替代品counsel

Grey # :OPTIONS ^:nil emacs smex的替代品counsel 尝试原因 之前使用emacs的生涯中&#xff0c;大部分时间都在使用spacemacs的配置。由于自己对于设计实现的一点好奇&#xff0c;加上spacemacs配置过于庞大&#xff0c;催生了自己维护一套精简够用的配置的想法。这个配置…

Netty源码学习7——netty是如何发送数据的

一丶Write事件的产生和传播 在业务逻辑处理完毕后&#xff0c;需要调用write 或者 writeAndFlush方法 ChannelHandlerContext#write or writeAndFlush方法会从当前 ChannelHandler 开始在 pipeline 中向前传播 write 事件直到 HeadContext。 ChannelHandlerContext.channel()#…

Leetcode100 链表|2. 两数相加160. 相交链表 234. 回文链表

2. 两数相加 题目&#xff1a;给你两个非空的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照逆序的方式存储的&#xff0c;并且每个节点只能存储一位数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0…

JAVA高级(后端需深入移步)

单元测试&#xff1a;使用Junit单元测试框架 使用Junit单元测试&#xff1a; 通过左侧的对❌来进行提示 Junit框架的常见注解&#xff1a; 反射&#xff08;用于框架&#xff0c;也是最重要&#xff09;&#xff1a;展示框架的成员信息 由于是用于对象&#xff0c;即使在获取…

【Java期末复习资料】(2)常见例题 //持续更新

本文章主要是常见例题&#xff0c;解析不会太详细&#xff0c;有问题、不会的可以给我发消息哦&#xff0c;后续会出模拟卷 常见例题&#xff1a; 1.下列跟Java技术平台有关的是&#xff08;ABD&#xff09; A.JVM B.JDK C.JPN D.JRE 2.面向对象的特征包括&#xff08;ACD&…