掌握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() {@Overridepublic void beginTextBlock() {}@Overridepublic void renderText(TextRenderInfo renderInfo) {System.out.println("---start text---");String text = renderInfo.getText();System.out.println(text);System.out.println("---end text---");}@Overridepublic void endTextBlock() {}@Overridepublic 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博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212192.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot 啟動之后報錯:Unsatisfied dependency through field ‘bbbClient’

springboot 啟動之后報錯&#xff1a;UnsatisfiedDepencyException:Error creating bean with name ‘aaaServiceImpl’: Unsatisfied dependency through field ‘bbbClient’。 這兩天一直在進行著日常 debugger 查看代碼。可是發生了一個挺“靈異”的事件。那就是我看的項目…

46. 全排列

46. 全排列 原題鏈接&#xff1a;完成情況&#xff1a;解題思路&#xff1a;參考代碼&#xff1a;_46全排列_構建數組回溯_46全排列_直接構建 錯誤經驗吸取 原題鏈接&#xff1a; 46. 全排列 https://leetcode.cn/problems/permutations/description/ 完成情況&#xff1a;…

codeforces D.In Love

思路 用兩個 m u l t i s e t multiset multiset 分別存 l , r l,r l,r 。你也可以寫平衡樹在 l l l 的 m u l t i s e t multiset multiset 里去查詢是否存在比最小的 r r r 大的 l l l 。 Think Twice, Code Once #include<bits/stdc.h> #define il inline #d…

小模型學習(1)-人臉識別

【寫作背景】因為最近一直在研究大模型&#xff0c;在與客戶進行交流時&#xff0c;如果要將大模型的變革性能力講清楚&#xff0c;就一定要能將AI小模型的一些原理和效果講清楚&#xff0c;進而形成對比。當然這不是一件簡單的事情&#xff0c;一方面大模型分析問題的的本質原…

Mybatis分頁插件PageHelper

PageHelper是什么&#xff1f; 是MyBatis提供的分頁插件&#xff0c;可以支持MySQL、Oracle等六種數據庫。 集成方式如下&#xff1a; 1 引入依賴 <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> <dependency><groupId>co…

反射加載SDK完成統一調用

文章目錄 1、需求背景2、接口抽象類具體實現類3、疑問4、存在的問題5、通過反射加載SDK并完成調用5、補充&#xff1a;關于業務網關7、補充&#xff1a;關于SDK的開發 關鍵點&#xff1a; 接口抽象類&#xff08;半抽象半實現&#xff09;具體實現類業務網關反射加載SDK&#…

JAVA如何調用python

以下代碼想通過測試&#xff0c;必須有一個前提&#xff1a;電腦上安裝了Python環境。不太習慣說廢話&#xff0c;直接上代碼了。 以下是用于測試的python代碼&#xff08;mytest.py&#xff09;&#xff1a; # 因為用戶到了參數處理&#xff0c;所以需要引用 import argpars…

Java學習手冊——第五篇數據類型

數據類型&#xff1a;是數據化的基石&#xff0c;如果沒有數據類型怎么表示呢&#xff1f;比如年齡可以用整數&#xff1a;18歲。如果有更好的表示方式大家可以留言喲~ 在舉個例子就是姓名&#xff0c;我們需要用字符串的形式來表示。這就是數據類型的魅力&#xff0c;而又有同…

TS基礎語法

前言&#xff1a; 因為在寫前端的時候&#xff0c;發現很多UI組件的語法都已經開始使用TS語法&#xff0c;不學習TS根本看不到懂&#xff0c;所以簡單的學一下TS語法。為了看UI組件的簡單代碼&#xff0c;不至于一臉懵。 一、安裝node 對于windows來講&#xff0c;node版本高…

電腦出現這些現象,說明你的固態硬盤要壞了

與傳統機械硬盤&#xff08;HDD&#xff09;相比&#xff0c;固態硬盤&#xff08;SSD&#xff09;速度更快、更穩定、功耗更低。但固態硬盤并不是完美無瑕的&#xff0c;由于顆粒寫入機制&#xff0c;可能會在七到十年的預期壽命之前出現故障。所以用戶最好為最終故障做好準備…

網頁設計中增強現實的興起

目錄 了解增強現實 增強現實的歷史背景 AR 和網頁設計的交叉點 AR 在網頁設計中的優勢 增強參與度和互動性 個性化的用戶體驗 競爭優勢和品牌差異化 AR 在網頁設計中的用例 結論 近年來&#xff0c;增強現實已成為一股變革力量&#xff0c;重塑了我們與數字領域互動的方式。它被…

【FMCW毫米波雷達設計 】 — FMCW波形

原書&#xff1a;FMCW Radar Design 1 引言 本章研究驅動FMCW雷達的主要波形:線性調頻(LFM)波形。我們研究信號的行為及其性質。隨后&#xff0c;本章討論了匹配濾波理論&#xff0c;并研究了壓縮這種波形的技術&#xff0c;特別是所謂的拉伸處理&#xff0c;它賦予FMCW雷達極…

DOS 批處理 (二)

DOS 批處理 1. 基礎 DOS 命令1.1 基礎命令1.2 文件系統操作1.3 文件夾管理1.4 文件管理1.5 網絡相關1.6 系統管理1.7 IF、FOR和NETIFFORNET 1. 基礎 DOS 命令 command /? 查找幫助DOS命令不區分命令字母的大小寫 C:\Users\Administrator>echo 1 1 C:\Users\Administrator…

基于SSM框架的倉庫管理系統

基于SSM框架的倉庫管理系統 文章目錄 基于SSM框架的倉庫管理系統 一.引言二.系統設計三.技術架構四.功能實現五.界面展示六.源碼獲取 一.引言 現代商業環境中&#xff0c;倉庫管理對于企業的運營效率和客戶滿意度至關重要。傳統的手工管理方式已經無法滿足日益復雜的倉儲需求。…

【Spring】SpringBoot日志

SpringBoot日志 日志概述日志使用打印日志獲取日志對象使用日志對象打印日志日志框架介紹門面模式SLF4J框架介紹(simple logging facade for java) 日志格式說明日志級別日志級別的分類日志級別的使用 日志配置配置日志級別日志持久化配置日志文件的路徑和文件名配置日志文件的…

【刷題篇】動態規劃(六)

文章目錄 1、最大子數組和2、環形子數組的最大和3、乘積最大子數組4、乘積為正數的最長子數組長度5、 等差數列劃分6、最長湍流子數組 1、最大子數組和 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&…

【Unity動畫】Avatar Mask

創建 Avatar Mask可以設置那一部分骨骼運動和不運動 然后放在狀態機里面的層中來混合 【后續完善】

深入探索 Rust 宏編程

Rust 宏提供了一種強大的方法來編寫抽象和重用代碼,它們在 Rust 編程中扮演著重要的角色。本文將深入探索 Rust 宏的概念、類型、使用方法以及如何實現自定義宏,以提供一個全面的 Rust 宏編程指南。 Rust 宏簡介 宏是 Rust 中的一種元編程工具,它們在編譯時運行,用于生成…

linux安裝node

文章目錄 安裝node 安裝node 一次手操記錄 - 首先安裝wget yum install -y wget - 下載nodejs最新的tar包 wget https://cdn.npm.taobao.org/dist/node/v12.12.0/node-v12.12.0-linux-x64.tar.xz - 解壓包 tar -xvf node-v12.12.0-linux-x64.tar.xz - 部署bin文件 先確認你no…

30 張圖解 HTTP 常見的面試題

前言 在面試過程中&#xff0c;HTTP 被提問的概率還是比較高的 我搜集了 5 大類 HTTP 面試常問的題目&#xff0c;同時這 5 大類題跟 HTTP 的發展和演變關聯性是比較大的&#xff0c;通過問答 圖解的形式由淺入深的方式幫助大家進一步的學習和理解 HTTP 協議。 HTTP 基本概…