最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java從零開始創(chuàng)建功能豐富的PDF文檔

 更新時間:2025年01月23日 10:04:23   作者:一名技術(shù)極客  
隨著數(shù)字化辦公的普及,PDF格式因其跨平臺兼容性和安全性而被廣泛應(yīng)用于各種場景中,本文將詳細(xì)介紹如何使用Java來實現(xiàn)PDF文檔的一鍵生成,有需要的可以了解下

引言

隨著數(shù)字化辦公的普及,PDF格式因其跨平臺兼容性和安全性而被廣泛應(yīng)用于各種場景中。對于開發(fā)者來說,能夠通過編程方式操作PDF文檔是一項非常有用的技術(shù)。本文將詳細(xì)介紹如何使用Java來實現(xiàn)PDF文檔的一鍵生成、文字插入、表單字段添加、電子簽名以及公章蓋章等高級功能。我們將主要使用開源庫 iText 來完成這些任務(wù)。

環(huán)境準(zhǔn)備

依賴引入

為了簡化開發(fā)過程并確保代碼的可維護(hù)性,推薦使用Maven作為構(gòu)建工具,并在pom.xml中添加iText庫的依賴:

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.3</version> <!-- 請根據(jù)實際情況選擇最新版本 -->
</dependency>

此外,如果需要處理圖像(例如公章),可能還需要額外引入圖像處理庫。

創(chuàng)建PDF文檔

一鍵生成空白PDF

讓我們從最基礎(chǔ)的功能開始——創(chuàng)建一個簡單的空白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);

        // 添加頁面內(nèi)容...
        document.close();
        System.out.println("PDF created at: " + dest);
    }
}

這段代碼會生成一個名為generated_pdf.pdf的空白PDF文件。

接下來,我們來看如何向PDF中添加文本內(nèi)容:

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."));
        
        // 更多功能可以繼續(xù)添加...

        document.close();
        System.out.println("Text added to PDF at: " + dest);
    }
}

這里使用了Paragraph類來創(chuàng)建段落對象,并將其添加到文檔中。

添加表單字段(選項)

iText 支持創(chuàng)建交互式表單字段,比如文本框、復(fù)選框等。這允許用戶與PDF進(jìn)行互動。

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);

        // 創(chuàng)建表單
        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());

        // 可以繼續(xù)添加更多類型的字段...

        document.close();
        System.out.println("Form fields added to PDF at: " + dest);
    }
}

在這個例子中,我們創(chuàng)建了一個名為textField的文本框,并將其放置在PDF的第一頁上。

添加電子簽名

為PDF添加數(shù)字簽名不僅增加了文檔的安全性,也提高了其可信度。下面是如何在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");
    }
}

請注意,此代碼片段假設(shè)你已經(jīng)有了包含私鑰和證書的密鑰庫文件(如.p12)。你需要根據(jù)實際情況調(diào)整路徑和其他參數(shù)。

添加公章圖像

最后,我們來看看如何在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); // 自動縮放以適應(yīng)頁面
        img.setFixedPosition(400, 50); // 設(shè)置固定位置
        
        document.add(img);

        document.close();
        System.out.println("Stamp image added to PDF at: " + dest);
    }
}

這段代碼展示了如何加載圖像文件并將其作為固定位置的元素添加到PDF中。

結(jié)論

通過上述步驟,我們已經(jīng)成功地實現(xiàn)了使用Java和iText庫來生成PDF文檔、插入文字、添加表單字段、應(yīng)用電子簽名以及嵌入公章圖像。這只是冰山一角;iText還提供了許多其他強(qiáng)大功能,如合并多個PDF、水印、加密解密等。

以上就是Java從零開始創(chuàng)建功能豐富的PDF文檔的詳細(xì)內(nèi)容,更多關(guān)于Java創(chuàng)建PDF的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java學(xué)習(xí)之線程同步與線程間通信詳解

    Java學(xué)習(xí)之線程同步與線程間通信詳解

    這篇文章主要為大家詳細(xì)介紹了線程同步和線程之間的通信的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-12-12
  • 淺談Spring Boot、MyBatis、MyBatis-Plus 依賴版本對應(yīng)關(guān)系

    淺談Spring Boot、MyBatis、MyBatis-Plus 依賴版本對應(yīng)關(guān)系

    本文主要介紹了SpringBoot、MyBatis和MyBatis-Plus的依賴版本對應(yīng)關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Java中父類怎么調(diào)用子類的方法

    Java中父類怎么調(diào)用子類的方法

    這篇文章主要介紹了Java父類調(diào)用子類的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot接口返回日期格式化的3種方法實現(xiàn)與對比

    SpringBoot接口返回日期格式化的3種方法實現(xiàn)與對比

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中接口返回日期格式化的3種方法實現(xiàn)與對比,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-09-09
  • Java switch多值匹配操作詳解

    Java switch多值匹配操作詳解

    這篇文章主要介紹了Java switch多值匹配操作詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 使用redisTemplate從redis獲取所有數(shù)據(jù)

    使用redisTemplate從redis獲取所有數(shù)據(jù)

    這篇文章主要介紹了使用redisTemplate從redis獲取所有數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java string類的常用方法詳細(xì)介紹

    java string類的常用方法詳細(xì)介紹

    在開發(fā)過程中經(jīng)常會使用到j(luò)ava string類的方法,本文將以此問題進(jìn)行詳細(xì)介紹
    2012-11-11
  • Java中Validated、Valid 、Validator區(qū)別詳解

    Java中Validated、Valid 、Validator區(qū)別詳解

    本文主要介紹了Java中Validated、Valid 、Validator區(qū)別,有時候面試的時候會被問到,他們的區(qū)別你知道幾個,本文就來詳細(xì)的介紹一下
    2021-08-08
  • 關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系

    關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系

    這篇文章主要介紹了關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系,WeakHashMap從名字可以得知主要和Map有關(guān),不過還有一個Weak,我們就更能自然而然的想到這里面還牽扯到一種弱引用結(jié)構(gòu),因此想要徹底搞懂,我們還需要知道四種引用,需要的朋友可以參考下
    2023-09-09
  • 深入理解Java編程線程池的實現(xiàn)原理

    深入理解Java編程線程池的實現(xiàn)原理

    這篇文章主要介紹了深入理解Java編程線程池的實現(xiàn)原理,涉及ThreadPoolExecutor類,線程池實現(xiàn)原理及示例等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論

甘德县| 洛扎县| 百色市| 涿鹿县| 宝丰县| 磐石市| 东宁县| 巍山| 昔阳县| 英德市| 昔阳县| 安康市| 镇远县| 青浦区| 阿鲁科尔沁旗| 甘孜县| 北安市| 白河县| 龙门县| 华池县| 安徽省| 罗田县| 嘉荫县| 光泽县| 龙南县| 吉隆县| 新竹市| 体育| 偃师市| 任丘市| 泽普县| 于田县| 清原| 金平| 庆阳市| 通渭县| 宣化县| 金堂县| 丘北县| 榆树市| 平潭县|