要使用Java的Apache PDFBox庫(kù)制作一個(gè)PDF表格模板并填充數(shù)據(jù),你需要遵循以下步驟:
-
添加依賴:首先,確保你的項(xiàng)目中包含了Apache PDFBox的依賴。如果你使用Maven,可以在你的
pom.xml
文件中添加以下依賴:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
-
創(chuàng)建PDF模板:你可以使用PDFBox創(chuàng)建一個(gè)簡(jiǎn)單的PDF模板,或者使用其他工具(比如Adobe Acrobat)創(chuàng)建PDF模板,并在模板中添加表格。
-
填充表格數(shù)據(jù):使用PDFBox API向PDF模板中的表格填充數(shù)據(jù)。
下面是一個(gè)簡(jiǎn)單的例子,演示如何使用PDFBox創(chuàng)建一個(gè)包含表格的PDF文檔,并向表格中填充數(shù)據(jù):
import com.google.common.collect.Lists;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class PDFBoxExample {
public static void main(String[] args) {
// 保存的pdf全路徑
String outPdfPath = "/out.pdf";
// pdf需要展示的文本
String text = "這是一些文本";
// pdf中表格需要填充的數(shù)據(jù)
List<List<String>> data = Lists.newArrayList();
// 創(chuàng)建一個(gè)新的PDF文檔
try (PDDocument newDocument = new PDDocument()) {
ClassLoader classLoader = PDFBoxExample.class.getClassLoader();
String[][] content = new String[data.size() + 1][8];
content[0] = new String[]{"列1", "列2", "列3", "列4", "列5", "列6", "列7", "列8"};
for (int i = 0; i < data.size(); i++) {
List<String> dto = data.get(i);
content[i + 1] = new String[]{dto.get(0), dto.get(1), dto.get(2), dto.get(3), dto.get(4), dto.get(5), dto.get(6), dto.get(7)};
}
PDPage pdPage = new PDPage();
// 加載自定義字體
InputStream inputStream = classLoader.getResourceAsStream("fonts/weiruanyahei.ttf");
PDFont font = PDType0Font.load(newDocument, inputStream);
// 創(chuàng)建一個(gè)新的內(nèi)容流,用于向頁(yè)面添加內(nèi)容
try (PDPageContentStream contentStream = new PDPageContentStream(newDocument, pdPage)) {
// 開始寫文本
contentStream.beginText();
//設(shè)置文本字體
contentStream.setFont(font, 12);
contentStream.newLineAtOffset(100, 700);
contentStream.showText(text);
// 結(jié)束文本塊
contentStream.endText();
// 在文本之后 繪制表格
drawTable(contentStream, 500, 10, content, font, 7);
}
newDocument.addPage(pdPage);
// 保存新的PDF文檔
newDocument.save(outPdfPath);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 繪制表格的方法
* @param contentStream PDPageContentStream對(duì)象,用于在PDF頁(yè)面上繪制內(nèi)容
* @param y 表格的起始y坐標(biāo),即表格的頂部位置
* @param margin 表格的左邊距
* @param content 表格的內(nèi)容,一個(gè)二維字符串?dāng)?shù)組,表示表格的行和列
* @param font PDFont對(duì)象,表示文本的字體
* @param fontSize 文本的字體大小
* @throws IOException IO異常
*/
private static void drawTable(PDPageContentStream contentStream,
float y, float margin,
String[][] content, PDFont font, int fontSize) throws IOException {
final int rows = content.length;
final int cols = content[0].length;
final float rowHeight = 20f;
// 邊距
final float cellMargin = 5f;
// 計(jì)算每列的最大寬度
float[] colMaxWidths = new float[cols];
for (int i = 0; i < cols; i++) {
for (String[] row : content) {
float textWidth = font.getStringWidth(row[i]) / 1000 * fontSize;
if (textWidth > colMaxWidths[i]) {
colMaxWidths[i] = textWidth;
}
}
// 為每列的文本添加邊距
colMaxWidths[i] += 2 * cellMargin;
}
// 檢查表格總寬度是否超出頁(yè)面寬度
float totalColWidth = 0f;
for (float width : colMaxWidths) {
totalColWidth += width;
}
// 繪制行
float nexty = y;
for (int i = 0; i <= rows; i++) {
contentStream.moveTo(margin, nexty);
contentStream.lineTo(margin + totalColWidth, nexty);
contentStream.stroke();
nexty -= rowHeight;
}
// 繪制列
float nextx = margin;
for (int i = 0; i < cols; i++) {
contentStream.moveTo(nextx, y);
contentStream.lineTo(nextx, y - rowHeight * rows);
contentStream.stroke();
nextx += colMaxWidths[i];
}
// 繪制最后一條列線
contentStream.moveTo(nextx, y);
contentStream.lineTo(nextx, y - rowHeight * rows);
contentStream.stroke();
// 添加文本到表格
float textx = margin + cellMargin;
// 從字體度量中獲取字體的上升和下降值,以確保文本居中
float fontHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() / 1000 * fontSize;
float fontDescent = font.getFontDescriptor().getDescent() / 1000 * fontSize;
// 計(jì)算文本基線到單元格頂部的距離
// 調(diào)整垂直居中
float texty = y - (rowHeight / 2) - (fontHeight / 2) - fontDescent;
for (String[] row : content) {
for (int i = 0; i < row.length; i++) {
String cell = row[i];
contentStream.beginText();
contentStream.setFont(font, fontSize);
contentStream.newLineAtOffset(textx, texty);
contentStream.showText(cell);
contentStream.endText();
textx += colMaxWidths[i];
}
texty -= rowHeight;
textx = margin + cellMargin;
}
}
}
這段代碼創(chuàng)建了一個(gè)包含表格和數(shù)據(jù)的PDF文檔。注意,這個(gè)例子中的表格是靜態(tài)的,意思是你不能像在HTML中那樣動(dòng)態(tài)地添加或刪除行。如果你需要更復(fù)雜的表格布局,你可能需要編寫更多的代碼來計(jì)算行和列的位置。
如果你的PDF模板是預(yù)先存在的,并且包含可編輯的表單字段,你可以使用PDDocument
和PDAcroForm
類來填充這些字段,而不是手動(dòng)繪制表格。這通常是處理復(fù)雜模板的更好方法。文章來源:http://www.zghlxwxcb.cn/news/detail-834715.html
請(qǐng)記住,PDFBox是一個(gè)底層庫(kù),因此創(chuàng)建復(fù)雜的表格布局可能需要相當(dāng)多的手動(dòng)計(jì)算和布局工作。對(duì)于更復(fù)雜的需求,可能需要考慮使用其他庫(kù)或工具,例如iText,它提供了更高級(jí)的表格創(chuàng)建功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-834715.html
到了這里,關(guān)于如何通過Java的Apache PDFBox庫(kù)制作一個(gè)PDF表格模板并填充數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!