Java利用iTextPDF庫(kù)實(shí)現(xiàn)制作PDF表格模板并填充數(shù)據(jù)
要使用Java的iTextPDF庫(kù)制作一個(gè)PDF表格模板并填充數(shù)據(jù),你需要遵循以下步驟:
添加依賴:首先,確保你的項(xiàng)目中包含了iTextPDF庫(kù)的依賴。如果你使用Maven,可以在你的pom.xml文件中添加以下依賴:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.11</version>
</dependency>
創(chuàng)建PDF模板:你可以使用iTextPDF創(chuàng)建一個(gè)簡(jiǎn)單的PDF模板,或者使用其他工具(比如Adobe Acrobat)創(chuàng)建PDF模板,并在模板中添加表格。
填充表格數(shù)據(jù):使用iTextPDF API向PDF模板中的表格填充數(shù)據(jù)。
下面是一個(gè)簡(jiǎn)單的例子,演示如何使用PDFBox創(chuàng)建一個(gè)包含表格的PDF文檔,并向表格中填充數(shù)據(jù):
import com.google.common.collect.Lists;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
public class ITextPDFExample {
public static void main(String[] args) {
// 保存的pdf全路徑
String outPdfPath = "/path/out.pdf";
// pdf中表格需要填充的數(shù)據(jù)
List<List<String>> data = Lists.newArrayList();
data.add(Lists.newArrayList("列1值", "列2值", "列3值", "列4值", "列5值"));
//創(chuàng)建文件
Document document = new Document(PageSize.A4);
File file = new File(outPdfPath);
try {
PdfWriter.getInstance(document, new FileOutputStream(file));
//打開(kāi)文件
document.open();
//BaseFont-確認(rèn)支持中文
String fontPath = "/path/to/your/chinese/font.ttf";
// 創(chuàng)建BaseFont對(duì)象,指定字體路徑和編碼
BaseFont bfChinese = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font fontChineseTitle = new Font(bfChinese, 12, Font.NORMAL);
String contentTitle = "標(biāo)題";
Paragraph paragraphTitle = new Paragraph(contentTitle, fontChineseTitle);
paragraphTitle.setAlignment(Element.ALIGN_CENTER);
document.add(paragraphTitle);
Paragraph blankRow1 = new Paragraph(18f, " ", fontChineseTitle);
document.add(blankRow1);
Font fontChineseParagraph = new Font(bfChinese, 12, Font.NORMAL);
String contentParagraph2 = "文本內(nèi)容1";
Paragraph paragraph2 = new Paragraph(contentParagraph2, fontChineseParagraph);
paragraph2.setFirstLineIndent(28);
document.add(paragraph2);
paragraphTitle.setSpacingAfter(100);
paragraphTitle.setSpacingBefore(100);
Paragraph blankRow2 = new Paragraph(18f, " ", fontChineseParagraph);
document.add(blankRow2);
Font fontChineseTable = new Font(bfChinese, 12, Font.NORMAL);
PdfPTable table = new PdfPTable(5);
List<PdfPRow> listRow = table.getRows();
//設(shè)置列寬
float[] columnWidths = {10, 27, 24, 16, 23};
table.setWidths(columnWidths);
//行1
PdfPCell[] cells1 = new PdfPCell[5];
PdfPRow row1 = new PdfPRow(cells1);
//單元格
cells1[0] = new PdfPCell(new Paragraph("列1", fontChineseTable));
cells1[0].setBorderColor(BaseColor.BLACK);
cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells1[1] = new PdfPCell(new Paragraph("列2", fontChineseTable));
cells1[1].setBorderColor(BaseColor.BLACK);
cells1[1].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells1[2] = new PdfPCell(new Paragraph("列3", fontChineseTable));
cells1[2].setBorderColor(BaseColor.BLACK);
cells1[2].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells1[3] = new PdfPCell(new Paragraph("列4", fontChineseTable));
cells1[3].setBorderColor(BaseColor.BLACK);
cells1[3].setVerticalAlignment(Element.ALIGN_MIDDLE);
cells1[4] = new PdfPCell(new Paragraph("列5", fontChineseTable));
cells1[4].setBorderColor(BaseColor.BLACK);
cells1[4].setVerticalAlignment(Element.ALIGN_MIDDLE);
//把第一行添加到集合
listRow.add(row1);
for (int i = 0; i < data.size(); i++) {
PdfPCell[] cellsi = new PdfPCell[5];
PdfPRow rowi = new PdfPRow(cellsi);
cellsi[0] = new PdfPCell(new Paragraph(data.get(i).get(0), fontChineseParagraph));
cellsi[0].setBorderColor(BaseColor.BLACK);
cellsi[0].setVerticalAlignment(Element.ALIGN_MIDDLE);
cellsi[1] = new PdfPCell(new Paragraph(data.get(i).get(1), fontChineseParagraph));
cellsi[1].setBorderColor(BaseColor.BLACK);
cellsi[1].setVerticalAlignment(Element.ALIGN_MIDDLE);
cellsi[2] = new PdfPCell(new Paragraph(data.get(i).get(2), fontChineseParagraph));
cells1[2].setBorderColor(BaseColor.BLACK);
cells1[2].setVerticalAlignment(Element.ALIGN_MIDDLE);
cellsi[3] = new PdfPCell(new Paragraph(data.get(i).get(3), fontChineseParagraph));
cellsi[3].setBorderColor(BaseColor.BLACK);
cellsi[3].setVerticalAlignment(Element.ALIGN_MIDDLE);
cellsi[4] = new PdfPCell(new Paragraph(data.get(i).get(4), fontChineseParagraph));
cellsi[4].setBorderColor(BaseColor.BLACK);
cellsi[4].setVerticalAlignment(Element.ALIGN_MIDDLE);
listRow.add(rowi);
}
//把表格添加到文件中
document.add(table);
Paragraph blankRow3 = new Paragraph(18f, " ", fontChineseParagraph);
document.add(blankRow3);
String contentParagraph4 = "文本內(nèi)容2";
Paragraph paragraph4 = new Paragraph(contentParagraph4, fontChineseParagraph);
paragraph4.setAlignment(Element.ALIGN_RIGHT);
document.add(paragraph4);
String contentParagraph5 = "文本內(nèi)容3";
;
Paragraph paragraph5 = new Paragraph(contentParagraph5, fontChineseParagraph);
paragraph5.setAlignment(Element.ALIGN_RIGHT);
document.add(paragraph5);
//關(guān)閉文檔
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}在這個(gè)例子中,你需要替換fontPath的值為你的中文字體文件的實(shí)際路徑。BaseFont.IDENTITY_H是指定字體編碼的參數(shù),它表示字體將支持Unicode字符集的水平顯示,這對(duì)于渲染中文字符是必須的。
BaseFont.NOT_EMBEDDED參數(shù)表示字體不會(huì)被嵌入到PDF文檔中,如果你想要確保PDF在不同設(shè)備上的兼容性,你可能需要將字體嵌入到PDF中,這時(shí)可以將此參數(shù)改為BaseFont.EMBEDDED。
如果你的PDF模板是預(yù)先存在的,并且包含可編輯的表單字段,你可以使用PDDocument和PDAcroForm類來(lái)填充這些字段,而不是手動(dòng)繪制表格。這通常是處理復(fù)雜模板的更好方法。
Java的iTextPDF庫(kù)和Apache PDFBox庫(kù)都是用于生成PDF文檔的開(kāi)源庫(kù),它們有一些區(qū)別,適用于不同的場(chǎng)景。
1.iTextPDF庫(kù):
- iTextPDF是一個(gè)功能強(qiáng)大且靈活的PDF庫(kù),支持創(chuàng)建、修改和處理PDF文檔。
- iTextPDF提供了豐富的API和功能,可以創(chuàng)建復(fù)雜的PDF文檔,包括表格、圖像、水印、書(shū)簽等。
- iTextPDF支持各種字體、顏色和樣式的自定義,可以實(shí)現(xiàn)高度定制化的PDF生成。
- iTextPDF有商業(yè)和開(kāi)源版本可用,商業(yè)版本提供了更多的功能和支持。
適用場(chǎng)景:
- 需要?jiǎng)?chuàng)建復(fù)雜的PDF文檔,包括表格、圖像、水印、書(shū)簽等。
- 需要高度定制化的PDF生成。
- 需要商業(yè)版本提供的額外功能和支持。
2.Apache PDFBox庫(kù):
- Apache PDFBox是一個(gè)功能強(qiáng)大的PDF庫(kù),主要用于處理和操作PDF文檔。
- PDFBox提供了一系列的API,可以讀取、創(chuàng)建、修改和提取PDF文檔的內(nèi)容。
- PDFBox支持文本提取、圖像提取、加密解密、表單處理等功能。
- PDFBox的API相對(duì)較底層,需要開(kāi)發(fā)者對(duì)PDF文檔結(jié)構(gòu)和操作有一定的了解。
適用場(chǎng)景:
- 需要處理和操作PDF文檔的內(nèi)容,如文本提取、圖像提取、加密解密、表單處理等。
- 對(duì)PDF文檔結(jié)構(gòu)和操作有一定的了解。
總的來(lái)說(shuō),如果你需要?jiǎng)?chuàng)建復(fù)雜的PDF文檔并且需要高度定制化,可以選擇iTextPDF庫(kù)。如果你主要需要處理和操作PDF文檔的內(nèi)容,可以選擇Apache PDFBox庫(kù)。
以上就是Java利用iTextPDF庫(kù)實(shí)現(xiàn)制作PDF表格模板并填充數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于Java iTextPDF制作PDF表格模板的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot自動(dòng)掃描包路徑來(lái)龍去脈示例詳解
這篇文章主要介紹了Springboot自動(dòng)掃描包路徑來(lái)龍去脈示例詳解,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
使用hutool進(jìn)行ftp文件下載和上傳詳細(xì)代碼示例
在開(kāi)發(fā)Java項(xiàng)目時(shí),FTP客戶端是經(jīng)常需要使用的工具,因?yàn)镕TP協(xié)議在文件傳輸方面有著廣泛的應(yīng)用,這篇文章主要給大家介紹了關(guān)于使用hutool進(jìn)行ftp文件下載和上傳的相關(guān)資料,需要的朋友可以參考下2024-02-02
Mybatis中自定義實(shí)例化SqlSessionFactoryBean問(wèn)題
這篇文章主要介紹了Mybatis中自定義實(shí)例化SqlSessionFactoryBean問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Spring數(shù)據(jù)源及配置文件數(shù)據(jù)加密實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Spring數(shù)據(jù)源及配置文件數(shù)據(jù)加密實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
SpringBoot3外部化配置與aop實(shí)現(xiàn)方案
這篇文章給大家介紹SpringBoot3外部化配置與aop實(shí)現(xiàn)方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2026-01-01
Springboot初始化啟動(dòng)報(bào)錯(cuò)Error?creating?bean?with?name?'da
這篇文章主要為大家介紹了Springboot初始化啟動(dòng)報(bào)Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Spring?@DateTimeFormat日期格式化時(shí)注解場(chǎng)景分析
這篇文章主要介紹了Spring?@DateTimeFormat日期格式化時(shí)注解場(chǎng)景分析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
idea使用war以及war exploded的區(qū)別說(shuō)明
本文詳細(xì)解析了war與warexploded兩種部署方式的差異及步驟,war方式是先打包成war包,再部署到服務(wù)器上;warexploded方式是直接把文件夾、class文件等移到Tomcat上部署,支持熱部署,開(kāi)發(fā)時(shí)常用,文章分別列出了warexploded模式和war包形式的具體操作步驟2024-10-10
Java多態(tài)成員訪問(wèn)的特點(diǎn)是什么?
在上一篇文章中介紹了方法重載和方法重寫(xiě)的區(qū)別,但是在多態(tài)情況下發(fā)現(xiàn)程序的執(zhí)行結(jié)果和我們預(yù)期的不太一樣,這篇將繼續(xù)介紹多態(tài)場(chǎng)景下,Java成員訪問(wèn)的特點(diǎn),需要的朋友可以參考下2021-06-06

