当前位置: 首页 > article >正文

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文档。


http://www.kler.cn/a/460935.html

相关文章:

  • 二维码文件在线管理系统-收费版
  • CentOS — 压缩解压
  • 【数据库系列】Spring Boot 中整合 MyBatis-Plus详细步骤
  • C++ 面向对象编程:多态、虚函数原理
  • 吾杯网络安全技能大赛——Misc方向WP
  • Python 图像处理:生成美丽的书籍封面
  • 32.失焦提示 C#例子 WPF例子
  • 建造者设计模式学习
  • Go 语言中强大的配置管理库—Viper
  • 比较各种排序方法的实现思想、优缺点和适用场合
  • Property ‘webkit‘ does not exist on type ‘Window typeof globalThis‘.
  • 学习笔记 --C#基础其他知识点(数据结构)
  • 2024年中国新能源汽车用车发展怎么样 PaperGPT(一)
  • PbootCMS V3.2.9前台SQL注入漏洞(上)
  • XML解析
  • FreeRTOS: 中断服务例程 Interrupt Service Routine, ISR
  • 架构师之路--达梦数据库事务控制详解
  • Rust windows 环境的安装
  • 如何实现企业精准定位?解锁高效传播的新路径,媒介盒子分享
  • 高防服务器在网络游戏中起着哪些作用?
  • 滴滴Java开发面试题及参考答案 (上)
  • Fama MacBeth两步法与多因子模型的回归检验
  • iOS 18手机不越狱玩MC java版---PojavLauncher
  • 【玩转23种Java设计模式】行为型模式篇:备忘录模式
  • 26. 机器人走迷宫
  • 条款42:了解 typename 的双重含义(Understand the two meanings of typename)