Java 操作 PDF:从零开始创建功能丰富的PDF文档
Java 操作 PDF:从零开始创建功能丰富的PDF文档
- 引言
- 环境准备
- 依赖引入
- 创建PDF文档
- 一键生成空白PDF
- 添加表单字段(选项)
- 添加电子签名
- 添加公章图像
- 结论
引言
随着数字化办公的普及,PDF格式因其跨平台兼容性和安全性而被广泛应用于各种场景中。对于开发者来说,能够通过编程方式操作PDF文档是一项非常有用的技术。本文将详细介绍如何使用Java来实现PDF文档的一键生成、文字插入、表单字段添加、电子签名以及公章盖章等高级功能。我们将主要使用开源库 iText 来完成这些任务。
环境准备
依赖引入
为了简化开发过程并确保代码的可维护性,推荐使用Maven作为构建工具,并在pom.xml
中添加iText库
的依赖:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.3</version> <!-- 请根据实际情况选择最新版本 -->
</dependency>
此外,如果需要处理图像(例如公章),可能还需要额外引入图像处理库。
创建PDF文档
一键生成空白PDF
让我们从最基础的功能开始——创建一个简单的空白PDF文件:
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.kernel.pdf.PdfDocument;
public class PdfCreationExample {
public static void main(String[] args) throws Exception {
String dest = "output/generated_pdf.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc);
// 添加页面内容...
document.close();
System.out.println("PDF created at: " + dest);
}
}
这段代码会生成一个名为generated_pdf.pdf
的空白PDF文件。
接下来,我们来看如何向PDF中添加文本内容:
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
public class AddTextToPdf {
public static void main(String[] args) throws Exception {
String dest = "output/pdf_with_text.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc);
// 添加段落
document.add(new Paragraph("Hello World! This is a sample text."));
// 更多功能可以继续添加...
document.close();
System.out.println("Text added to PDF at: " + dest);
}
}
这里使用了Paragraph
类来创建段落对象,并将其添加到文档中。
添加表单字段(选项)
iText
支持创建交互式表单字段,比如文本框、复选框等。这允许用户与PDF进行互动。
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.forms.fields.PdfTextField;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.layout.Document;
public class AddFormFields {
public static void main(String[] args) throws Exception {
String dest = "output/pdf_with_form_fields.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc);
// 创建表单
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
// 添加文本字段
PdfTextField textField = new PdfTextField(pdfDoc, new Rectangle(50, 750, 400, 15), "textField", "Enter your name here");
form.addField(textField.getPdfObject(), pdfDoc.getFirstPage());
// 可以继续添加更多类型的字段...
document.close();
System.out.println("Form fields added to PDF at: " + dest);
}
}
在这个例子中,我们创建了一个名为textField
的文本框,并将其放置在PDF的第一页上。
添加电子签名
为PDF添加数字签名不仅增加了文档的安全性,也提高了其可信度。下面是如何在PDF中嵌入签名的示例:
import com.itextpdf.signatures.*;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.StampingProperties;
import com.itextpdf.kernel.pdf.x509.CertificateUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.Calendar;
public class SignPdf {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static void signPdf(String src, String dest, String keystorePath, String password) throws Exception {
KeyStore ks = KeyStore.getInstance("PKCS12");
try (InputStream inputStream = new FileInputStream(keystorePath)) {
ks.load(inputStream, password.toCharArray());
}
String alias = ks.aliases().nextElement();
PrivateKey pk = (PrivateKey) ks.getKey(alias, password.toCharArray());
X509Certificate cert = (X509Certificate) ks.getCertificate(alias);
PdfReader reader = new PdfReader(src);
PdfSigner signer = new PdfSigner(reader, new FileOutputStream(dest), new StampingProperties());
PdfSignatureAppearance appearance = signer.getSignatureAppearance()
.setReason("Test Reason")
.setLocation("Test Location")
.setReuseAppearance(false);
ExternalDigest digest = new BouncyCastleDigest();
ExternalSignature signature = new PrivateKeySignature(pk, DigestAlgorithms.SHA256, "BC");
signer.signDetached(digest, signature, CertificateUtil.collectCertificatesFromChain(cert), null, null, null, 0, PdfSigner.CryptoStandard.CMS);
System.out.println("PDF signed and saved at: " + dest);
}
public static void main(String[] args) throws Exception {
signPdf("input/unsigned_pdf.pdf", "output/signed_pdf.pdf", "path/to/your/keystore.p12", "password");
}
}
请注意,此代码片段假设你已经有了包含私钥和证书的密钥库文件(如.p12
)。你需要根据实际情况调整路径和其他参数。
添加公章图像
最后,我们来看看如何在PDF中嵌入公章图像。这通常涉及到读取图像文件并将它放置在特定位置。
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import java.io.File;
public class AddStampImage {
public static void main(String[] args) throws Exception {
String dest = "output/pdf_with_stamp.pdf";
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc);
// 添加公章图片
Image img = new Image(ImageDataFactory.create("path/to/stamp_image.png"));
img.setAutoScale(true); // 自动缩放以适应页面
img.setFixedPosition(400, 50); // 设置固定位置
document.add(img);
document.close();
System.out.println("Stamp image added to PDF at: " + dest);
}
}
这段代码展示了如何加载图像文件并将其作为固定位置的元素添加到PDF中。
结论
通过上述步骤,我们已经成功地实现了使用Java和iText库来生成PDF文档、插入文字、添加表单字段、应用电子签名以及嵌入公章图像。这只是冰山一角;iText还提供了许多其他强大功能,如合并多个PDF、水印、加密解密等。希望这篇文章能为你提供一个良好的起点,帮助你在项目中更高效地操作PDF文档。