關于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文檔-進階篇