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

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

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

引言

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

環(huán)境準備

依賴引入

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

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

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

創(chuàng)建PDF文檔

一鍵生成空白PDF

讓我們從最基礎的功能開始——創(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);

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

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

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

添加表單字段(選項)

iText 支持創(chuàng)建交互式表單字段,比如文本框、復選框等。這允許用戶與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);

        // 創(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");
    }
}

請注意,此代碼片段假設你已經有了包含私鑰和證書的密鑰庫文件(如.p12)。你需要根據(jù)實際情況調整路徑和其他參數(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); // 自動縮放以適應頁面
        img.setFixedPosition(400, 50); // 設置固定位置
        
        document.add(img);

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

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

結論

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

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

相關文章

  • Java學習之線程同步與線程間通信詳解

    Java學習之線程同步與線程間通信詳解

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

    淺談Spring Boot、MyBatis、MyBatis-Plus 依賴版本對應關系

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

    Java中父類怎么調用子類的方法

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

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

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

    Java switch多值匹配操作詳解

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

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

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

    java string類的常用方法詳細介紹

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

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

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

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

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

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

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

最新評論

宕昌县| 咸宁市| 万山特区| 孟村| 三江| 皋兰县| 固始县| 阜阳市| 普格县| 皋兰县| 奉新县| 织金县| 宜良县| 金山区| 巴里| 元江| 崇文区| 卢氏县| 阿合奇县| 晋城| 镇雄县| 宜春市| 定兴县| 河源市| 乌拉特中旗| 赣榆县| 东乡县| 寿宁县| 冕宁县| 南汇区| 抚州市| 琼中| 洪泽县| 郯城县| 新乡县| 台前县| 桑植县| 呼玛县| 临泉县| 柳河县| 宁河县|