引言
在企业应用开发中,经常需要将数据导出为PDF格式的文档,如生成报表、合同、发票等。Java作为企业级开发的主流语言,提供了多种生成PDF文件的解决方案。本专题将详细介绍如何使用Java生成PDF文件,帮助开发者快速掌握相关技术。
我们将重点介绍两个最流行的开源库:iText 和 Apache PDFBox,并通过实际代码示例展示它们的使用方法。
iText 库
iText 是一个功能强大的Java库,用于创建和操作PDF文档。它支持复杂的布局、表格、图像、字体嵌入等功能。
添加依赖
如果你使用Maven,添加以下依赖:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
基本使用示例
以下是一个使用iText生成简单PDF文件的示例:
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileOutputStream;
import java.io.IOException;
public class PdfGenerator {
public static void main(String[] args) {
Document document = new Document();
try {
PdfWriter.getInstance(document, new FileOutputStream("hello.pdf"));
document.open();
document.add(new Paragraph("Hello, this is a PDF generated with iText!"));
document.add(new Paragraph("当前时间: " + new java.util.Date()));
System.out.println("PDF文件已生成: hello.pdf");
} catch (DocumentException | IOException e) {
e.printStackTrace();
} finally {
document.close();
}
}
}
Apache PDFBox
Apache PDFBox 是另一个流行的开源Java工具,用于处理PDF文档。它既可以创建新的PDF,也可以读取和修改现有的PDF文件。
添加依赖
Maven依赖配置:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
基本使用示例
使用PDFBox生成PDF的简单示例:
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import java.io.IOException;
public class PdfBoxExample {
public static void main(String[] args) {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage();
document.addPage(page);
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 18);
contentStream.newLineAtOffset(100, 700);
contentStream.showText("Hello from Apache PDFBox!");
contentStream.newLineAtOffset(0, -25);
contentStream.setFont(PDType1Font.COURIER, 14);
contentStream.showText("Generated on: " + new java.util.Date());
contentStream.endText();
}
document.save("pdfbox_hello.pdf");
System.out.println("PDF文件已生成: pdfbox_hello.pdf");
} catch (IOException e) {
e.printStackTrace();
}
}
}
选择建议
- iText:功能更丰富,API设计更直观,适合需要复杂布局和样式的场景。但要注意版本许可问题(iText 7之后采用AGPL)。
- PDFBox:Apache许可证,更宽松,适合需要读取/修改现有PDF的场景。API相对底层一些。
- 对于简单的PDF生成需求,两者都能胜任。建议根据项目许可要求和具体功能需求进行选择。
常见问题
中文乱码怎么办?
需要嵌入中文字体,例如:
// iText中使用中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(bf, 12);
document.add(new Paragraph("你好,世界!", font));
如何添加表格?
iText提供了PdfPTable类,PDFBox需要手动绘制表格线和填充内容。