Java中使用ItextPdf填充已有pdf表格并且分页
时间: 2024-01-27 19:04:13 浏览: 173
java采用itextpdf,对pdf大文件进行规格上的分出多个pdf
在Java中使用ItextPdf填充已有的PDF表格并且分页,需要使用ItextPdf的PdfReader和PdfStamper类。PdfReader类用于读取已有的PDF文件,而PdfStamper类则用于将填充的数据写入PDF文件。以下是一个简单的示例代码:
```java
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.*;
import java.io.*;
public class FillPDFWithTable {
public static void main(String[] args) throws IOException, DocumentException {
// 1. 读取已有的PDF文件
PdfReader reader = new PdfReader("original.pdf");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, outputStream);
// 2. 获取PDF文件中的表格
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
PdfPTable table = null;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
// 解析每一页的内容
TextExtractionStrategy strategy = parser.processContent(i, new LocationTextExtractionStrategy());
String text = strategy.getResultantText();
// 判断当前页是否包含表格
if (text.contains("table")) {
// 解析表格
table = getTableFromPage(reader, i);
// 删除原有表格
deleteTableFromPage(reader, i);
break;
}
}
// 3. 填充表格数据
if (table != null) {
for (int i = 0; i < 1000; i++) {
// 添加新行到表格
table.addCell("value1");
table.addCell("value2");
// 判断是否需要分页
if (i % 20 == 0 && i != 0) {
// 4. 插入分页符
stamper.insertPage(i / 20 + 1, reader.getPageSizeWithRotation(1));
}
}
// 5. 将填充后的表格写入PDF文件
PdfContentByte canvas = stamper.getOverContent(1);
table.writeSelectedRows(0, -1, 30, 700, canvas);
}
// 6. 关闭PdfStamper和PdfReader
stamper.close();
reader.close();
// 7. 将输出流中的数据写入PDF文件
FileOutputStream fos = new FileOutputStream("output.pdf");
fos.write(outputStream.toByteArray());
fos.flush();
fos.close();
}
// 从指定的页码中获取表格
public static PdfPTable getTableFromPage(PdfReader reader, int pageNum) throws IOException {
PdfDictionary page = reader.getPageN(pageNum);
PdfArray annots = page.getAsArray(PdfName.ANNOTS);
if (annots == null || annots.size() == 0) {
return null;
}
for (int i = 0; i < annots.size(); i++) {
PdfObject annotObj = annots.getPdfObject(i);
if (annotObj == null || !annotObj.isDictionary()) {
continue;
}
PdfDictionary annot = (PdfDictionary) annotObj;
PdfName subType = annot.getAsName(PdfName.SUBTYPE);
if (subType != null && subType.equals(PdfName.WIDGET)) {
PdfDictionary widgetDict = (PdfDictionary) PdfReader.getPdfObject(annot.get(PdfName.NM));
if (widgetDict != null && widgetDict.getAsString(PdfName.V) != null) {
// 获取表格所在的位置
PdfArray rectArr = annot.getAsArray(PdfName.RECT);
Rectangle rect = new Rectangle(rectArr.getAsNumber(0).floatValue(),
rectArr.getAsNumber(1).floatValue(),
rectArr.getAsNumber(2).floatValue(),
rectArr.getAsNumber(3).floatValue());
// 获取表格
PdfPTable table = new PdfPTable(2);
table.setTotalWidth(rect.getWidth());
table.setLockedWidth(true);
return table;
}
}
}
return null;
}
// 从指定的页码中删除表格
public static void deleteTableFromPage(PdfReader reader, int pageNum) throws IOException, DocumentException {
PdfDictionary page = reader.getPageN(pageNum);
PdfArray annots = page.getAsArray(PdfName.ANNOTS);
if (annots == null || annots.size() == 0) {
return;
}
PdfContentByte canvas = new PdfContentByte(reader);
for (int i = 0; i < annots.size(); i++) {
PdfObject annotObj = annots.getPdfObject(i);
if (annotObj == null || !annotObj.isDictionary()) {
continue;
}
PdfDictionary annot = (PdfDictionary) annotObj;
PdfName subType = annot.getAsName(PdfName.SUBTYPE);
if (subType != null && subType.equals(PdfName.WIDGET)) {
PdfDictionary widgetDict = (PdfDictionary) PdfReader.getPdfObject(annot.get(PdfName.NM));
if (widgetDict != null && widgetDict.getAsString(PdfName.V) != null) {
// 获取表格所在的位置
PdfArray rectArr = annot.getAsArray(PdfName.RECT);
Rectangle rect = new Rectangle(rectArr.getAsNumber(0).floatValue(),
rectArr.getAsNumber(1).floatValue(),
rectArr.getAsNumber(2).floatValue(),
rectArr.getAsNumber(3).floatValue());
// 删除表格
canvas.saveState();
canvas.rectangle(rect.getLeft(), rect.getBottom(), rect.getWidth(), rect.getHeight());
canvas.clip();
canvas.newPath();
canvas.endPath();
canvas.restoreState();
}
}
}
}
}
```
这个示例代码中,我们首先读取了已有的PDF文件,并且获取PDF文件中的表格。然后,我们填充表格数据,并且在需要分页的时候插入分页符。最后,我们将填充后的表格写入PDF文件,并且保存输出流中的数据到新的PDF文件中。
阅读全文