掌握iText:輕松處理PDF文檔-基礎篇

在這里插入圖片描述

關于iText

iText是一個強大的PDF處理庫,可以用于創建、讀取和操作PDF文件。它支持PDF表單、加密和簽署等操作,同時支持多種字體和編碼。maven的中央倉庫中的最新版本是5.X,且iText5不是完全免費的,但是基礎能力是免費使用的,不過需要遵循AGPLv3協議。iText7是iText5的后繼版本,相比之下有更好的性能和更全面的PDF支持。在實際開發中,可以根據需求選擇不同的iText版本。

iText核心功能

iText是一個用于在Java中創建和操作PDF文件的開源庫。以下是iText的一些主要功能:

  • 創建PDF文檔:iText可以創建新的PDF文檔,并提供了多種方法來添加文本、圖像、表格和其他內容。
  • 讀取和解析PDF文檔:iText可以讀取和解析現有的PDF文檔,提取文本、圖像和其他元素。
  • 編輯PDF文檔:iText可以編輯現有的PDF文檔,例如添加水印、合并多個文檔、添加頁眉和頁腳等。
  • 加密和解密PDF文檔:iText可以對PDF文檔進行加密和解密,提供了多種加密算法和安全選項。
  • 簽名和驗證PDF文檔:iText可以添加數字簽名到PDF文檔,并驗證文檔的完整性。
  • 拆分和合并PDF文檔:iText可以將PDF文檔拆分成單個頁面或合并多個文檔。
  • 壓縮和解壓縮PDF文檔:iText可以壓縮和解壓縮PDF文檔,以減小文件大小。
  • 創建和填充PDF表單:iText可以創建和填充PDF表單,包括文本框、單選框、復選框等。
  • 生成條形碼和二維碼:iText可以生成條形碼和二維碼,并將其添加到PDF文檔中。
  • 自定義字體和樣式:iText支持自定義字體和樣式,允許您使用自己的字體、字號和樣式來創建PDF文檔。
    至于收費功能,iText提供了一個商業版本的軟件,稱為iText Enterprise Edition。這個版本提供了一些額外的功能,例如高級的加密和安全性選項、高級的表單生成選項、高級的文檔處理功能等。這些功能在開源版本的iText中可能不可用或受到限制。

iText的依賴

  • itextpdf.jar是iText的核心庫,提供了用于創建和操作PDF文檔的基本功能。
  • itext-asian.jar是itext庫中關于亞洲編碼的類庫,特別適用于處理中文字符。
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>

實戰示例

創建pdf文檔并添加文本

1.創建一個Document對象實例。
2.創建一個PdfWriter對象,并將其與Document對象關聯,以便將文檔寫入硬盤。
3.打開Document對象,以便可以向其中添加內容。
4.向Document對象添加文本內容。這可以通過創建Paragraph對象并使用Document對象的add()方法來完成。
5.關閉Document對象,以完成PDF文檔的創建。

@Test
public void test0() {try {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello.pdf"));document.open();Element element = new Paragraph("hello, baby!");document.add(element);document.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();}
}

創建pdf文檔并添加圖片

與添加文本內容的過程比較類似,唯一不同的是,這里添加到文檔中的是圖片。在實際的業務開發過程中,如果默認使用圖片原始的心都,可能會導致在文檔中的圖片過大或過小,都不好看,最好根據頁面的寬度進行一定比例的自適應,這里介紹一種方法:
1.先獲取圖片的原始寬度和高度
2.再獲取PDF頁面的寬度和高度
3.然后根據頁面寬度計算圖片的縮放比例
4.最后根據縮放比例計算圖片的新寬度和高度,并重新設置圖片的寬度和高度;

@Test
public void test2() {try {Document document = new Document();PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello2.pdf"));document.open();Image image = Image.getInstance("d:/test/dog.jpg");// 獲取圖片的原始寬度和高度float originalWidth = image.getWidth();float originalHeight = image.getHeight();// 獲取PDF頁面的寬度和高度Rectangle pageSize = document.getPageSize();float pageWidth = pageSize.getWidth();// 根據頁面寬度計算圖片的縮放比例float scaleRatio = pageWidth / originalWidth;// 根據縮放比例計算圖片的新寬度和高度float newWidth = originalWidth * scaleRatio;float newHeight = originalHeight * scaleRatio;// 設置圖片的新寬度和高度,并保持縱橫比不變image.scaleToFit(newWidth, newHeight);image.setAlignment(Element.ALIGN_CENTER);document.add(image);document.close();} catch (DocumentException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}

創建pdf文檔并添加表格

1.創建PDF文檔對象。使用Document類創建一個新的PDF文檔對象,并打開它。
2.創建表格對象。使用PdfPTable類創建一個新的表格對象,并設置表格的列數和其他屬性。
3.向表格中添加內容。使用PdfPCell類創建單元格對象,并將它們添加到表格中。可以設置單元格的文本、樣式和布局等屬性。這里需要注意的是:在iText中并沒有行的概念,設置完表格的列數后,就是從左至右開始添加單元格內的內容,一般第一行是表頭。
4.將表格添加到文檔中。使用Document類的add()方法將表格添加到文檔中。
5.關閉文檔。使用Document類的close()方法關閉文檔,并保存到指定的文件路徑。

@Test
public void test3() {try {Document document = new Document();PdfWriter.getInstance(document, new FileOutputStream("d:/test/hello3.pdf"));document.open();// 創建PdfPTable對象并設置列寬度和間距PdfPTable table = new PdfPTable(3);float[] columnWidths = {1f, 1f, 1f};table.setWidths(columnWidths);table.setSpacingAfter(10f);table.setWidthPercentage(100); // 設置表格寬度占頁面寬度的百分比為100%// 添加表頭行PdfPCell headerCell1 = new PdfPCell(new Paragraph("realName"));headerCell1.setBackgroundColor(BaseColor.LIGHT_GRAY);table.addCell(headerCell1);PdfPCell headerCell2 = new PdfPCell(new Paragraph("age"));headerCell2.setBackgroundColor(BaseColor.LIGHT_GRAY);table.addCell(headerCell2);PdfPCell headerCell3 = new PdfPCell(new Paragraph("sex"));headerCell3.setBackgroundColor(BaseColor.LIGHT_GRAY);table.addCell(headerCell3);// 添加數據行table.addCell("zhangsan");table.addCell("18");table.addCell("boy");// 將表格添加到文檔中document.add(table);// 關閉文檔對象document.close();} catch (Exception e) {e.printStackTrace();}
}

讀取pdf內的文本

1.創建一個PDF讀取器對象(PdfReader):
2.創建一個PdfTextExtractor對象:
3.逐頁提取文本:
4.關閉PDF讀取器:

@Test
public void test6() {try {PdfReader pdfReader = new PdfReader(new FileInputStream("d:/test/hello5.pdf"));int numberOfPages = pdfReader.getNumberOfPages();for (int i = 0; i < numberOfPages; i++) {String textFromPage = PdfTextExtractor.getTextFromPage(pdfReader, i + 1);System.out.println(textFromPage);}} catch (Exception e) {e.printStackTrace();}
}

下一篇:掌握iText:輕松處理PDF文檔-進階篇

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

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

相關文章

2023-12-10 LeetCode每日一題(爬樓梯)

2023-12-10每日一題 一、題目編號 70. 爬樓梯二、題目鏈接 點擊跳轉到題目位置 三、題目描述 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢&#xff1f; 示例 1&#xff1a; 示例 2&#xff1a; 提…

gin投票系統2

投票系統 數據庫的建立 先分析需求&#xff0c;在sql中建立數據庫&#xff0c;關于項目數據庫如何建立可以在“goweb項目創建流程分析中看如何去建表” 成功后目前有四個表&#xff1a; vote&#xff0c;user&#xff0c;vote_opt,vote_opt_user 建立數據庫&#xff0c;可以…

Flink基本轉換算子map/filter/flatmap

map map是大家非常熟悉的大數據操作算子&#xff0c;主要用于將數據流中的數據進行轉換&#xff0c;形成新的數據流。簡單來說&#xff0c;就是一個“一一映射”&#xff0c;消費一個元素就產出一個元素。 我們只需要基于DataStream調用map()方法就可以進行轉換處理。方法需要…

案例026:基于微信小程序的原創音樂系統的設計與實現

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

什么是Restful?

Rest簡介 REST是英文representational state transfer(表象性狀態轉變)或者表述性狀態轉移。Rest是web服務的一種架構風格。使用HTTP,URI,XML,JSON,HTML等廣泛流行的標準和協議。輕量級,跨平臺,跨語言的架構設計。它是一種設計風格,不是一種標準,是一種思想。 Rest架構的主要…

java程序定時器

目錄 1.java定時器原生方法 1.java定時器原生方法 實現每天早上8點執行任務的示例代碼 import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit;public class TimeTest{pub…

汽車網絡安全--關于UN R155認證的思考

1.UN R155概述 2020年6月25日,聯合國頒布了全球首個汽車網絡安全強制性法規 -- UN 155,詳細規定了關于評估網絡安全措施的審核條款、制造商和供應商降低網絡安全風險的方法以及實施風險評估的義務等。 法規適用于與信息安全相關的M類(4輪及以上載客汽車)、N類(四輪載貨汽車)…

SpringBoot項目連接Graylog

直接用logback將控制臺輸出的日志發送到graylog上 1.導入logback依賴 <dependency> <groupId>de.siegmar</groupId> <artifactId>logback-gelf</artifactId> <version>1.1.0</version> </dependency> 2.創建logback-spring.x…

淺談低代碼

低代碼開發是近年來迅速崛起的軟件開發方法&#xff0c;讓編寫應用程序變得更快、更簡單。有人說它是美味的膳食&#xff0c;讓開發過程高效而滿足&#xff0c;但也有人質疑它是垃圾食品&#xff0c;缺乏定制性與深度。你認為低代碼到底是美以下方向僅供參考。味的膳食還是垃圾…

SpringBoot - 四種常見定時器

常見實現方案 Scheduled注解&#xff1a;基于注解Timer().schedule創建任務&#xff1a;基于封裝類Timer線程&#xff1a;使用線程直接執行任務即可&#xff0c;可以與thread、線程池、ScheduleTask等配合使用quartz配置定時器&#xff1a;基于spring的quartz框架 Scheduled注…

golang學習筆記——編寫最簡單的命令行工具

編寫最簡單的命令行工具 用戶輸入bufio 使用go語言編寫最簡單的命令行工具 mkdir hello-cli-demo cd hello-cli-demo # 查看環境變量 go envgo mod初始化 go mod init gitcode.com/m打開vscode&#xff0c;創建main.go package mainimport ("fmt""bufio&qu…

RK3568 CIF和ISP的關聯

1. 引言 在本文檔中&#xff0c;我們將介紹RK3568芯片的CIF&#xff08;Camera Interface&#xff09;和ISP&#xff08;Image Signal Processor&#xff09;模塊。這兩個模塊是RK3568芯片的關鍵組成部分&#xff0c;用于圖像采集和處理。 CIF是一個標準接口&#xff0c;用于…

快速測試 3節點的redis sentinel集群宕機2個節點以后是否仍能正常使用

有同事問我&#xff0c;三個redis sentinel節點&#xff0c;宕機兩個節點以后&#xff0c;是否還能夠正常的通過redis sentinel正常訪問redis的數據。我想了想&#xff0c;理論上是可以的&#xff0c;但是我沒試過&#xff0c;今天有時間就測試了一下。搭建環境和測試代碼的過程…

Java并發(十七)----變量的線程安全分析

1、成員變量和靜態變量是否線程安全 如果它們沒有共享&#xff0c;則線程安全 如果它們被共享了&#xff0c;根據它們的狀態是否能夠改變&#xff0c;又分兩種情況 如果只有讀操作&#xff0c;則線程安全 如果有讀寫操作&#xff0c;則這段代碼是臨界區&#xff0c;需要考慮線…

深入了解Python pydash庫

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 在數據處理和分析領域&#xff0c;Python一直是一種強大的編程語言。然而&#xff0c;在處理大規模數據集和執行復雜操作時&#xff0c;有時候需要更高效的工具。在本文中&#xff0c;我們將深入探討pydash庫&am…

語義分割 簡介及數據集簡介

參考文章 MS COCO數據集介紹以及pycocotools簡單使用-CSDN博客

[MySQL--進階篇]存儲引擎的體系結構、簡介、特點、選擇

前言 ?Hello!這里是歐_aita的博客。 ?今日語錄&#xff1a;不要在乎別人怎么看你&#xff0c;因為他們根本就沒有時間&#xff0c;他們只關心他們自己。 ?個人主頁&#xff1a;歐_aita ψ(._. )>?個人專欄&#xff1a; 數據結構與算法 MySQL數據庫 存儲引擎 前言MySQL體…

代碼隨想錄算法訓練營第四十一天|343. 整數拆分、96.不同的二叉搜索樹

代碼隨想錄算法訓練營第四十一天|343. 整數拆分、96.不同的二叉搜索樹 整數拆分 343. 整數拆分 文章講解&#xff1a;https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 題目鏈接&#xff1a;https://leetcode.cn/problems/integer-break/ 視頻講解…

李宏毅gpt個人記錄

參考&#xff1a; 李宏毅機器學習--self-supervised&#xff1a;BERT、GPT、Auto-encoder-CSDN博客 用無標注資料的任務訓練完模型以后&#xff0c;它本身沒有什么用&#xff0c;GPT 1只能夠把一句話補完&#xff0c;可以把 Self-Supervised Learning 的 Model做微微的調整&am…

32.768KHz時鐘RTC晶振精度PPM值及頻差計算

一個數字電路就像一所城市的交通&#xff0c;晶振的作用就是十字路口的信號燈&#xff0c;因此晶振的品質及其電路應用尤其關鍵。數字電路又像生命體&#xff0c;它的運行就像人身體里的血液流通&#xff0c;它不是由單一的某個器件或器件單元構成&#xff0c;而是由多個器件及…