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

使用java實(shí)現(xiàn)pdf電子簽章功能

 更新時(shí)間:2025年05月30日 08:15:27   作者:星辰聊技術(shù)  
這篇文章主要為大家詳細(xì)介紹了如何使用java實(shí)現(xiàn)簡(jiǎn)單的pdf電子簽章功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

將Word文檔轉(zhuǎn)換為PDF并添加水印、簽名和蓋章的過程大致可以分為以下幾個(gè)步驟:

實(shí)現(xiàn)水印和簽名接口 實(shí)現(xiàn)轉(zhuǎn)換方法 測(cè)試代碼 下面將詳細(xì)介紹每一步。

步驟1:引入依賴

我們需要引入Apache POI和OpenPDF兩個(gè)庫(kù)來實(shí)現(xiàn)Word和PDF之間的轉(zhuǎn)換,具體步驟如下:

在Maven項(xiàng)目中,可以在pom.xml中添加以下依賴:

<!-- Apache POI -->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.1.2</version>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.1.2</version>
</dependency>

<!-- OpenPDF -->
<dependency>
  <groupId>com.lowagie</groupId>
  <artifactId>itext</artifactId>
  <version>2.1.7</version>
</dependency>

步驟2:實(shí)現(xiàn)水印和簽名接口

我們需要實(shí)現(xiàn)PdfPageEvent接口來添加水印和簽名,具體實(shí)現(xiàn)可以參考下面的代碼:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

import java.io.IOException;

public class Watermark implements PdfPageEvent {
    private final String text;

    public Watermark(String text) {
        this.text = text;
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        PdfContentByte canvas = writer.getDirectContentUnder();
        Phrase watermark = new Phrase(text, new Font(FontFamily.HELVETICA, 52, Font.NORMAL, BaseColor.LIGHT_GRAY));

        Rectangle rect = new Rectangle(document.getPageSize());
        rect.setBorder(Rectangle.BOX);
        rect.setBorderWidth(1);
        rect.setBorderColor();
        rect.setUseVariableBorders(true);

        ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER, watermark, 0, 0, 45);
        canvas.rectangle(rect);
        canvas.stroke();
    }
}

public class Signature implements PdfPageEvent {
    private static final int FONT_SIZE = 14;
    private static final int IMAGE_SIZE = 100;
    private final String imagePath;
    private final String signatureText;

    public Signature(String imagePath, String signatureText) {
        this.imagePath = imagePath;
        this.signatureText = signatureText;
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        try {
            // 添加簽名
            Image image = Image.getInstance(imagePath);
            image.scaleAbsolute(IMAGE_SIZE, IMAGE_SIZE);
            image.setAbsolutePosition((document.getPageSize().getWidth() - image.getScaledWidth()) / 2,
                    (document.getPageSize().getHeight() - image.getScaledHeight()) / 2);

            // 添加蓋章
            PdfContentByte canvas = writer.getDirectContent();
            BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            canvas.beginText();
            canvas.setFontAndSize(font, FONT_SIZE);
            canvas.showTextAligned(Element.ALIGN_CENTER, signatureText,
                    document.getPageSize().getWidth() - 80, 120, 0);
            canvas.endText();

            canvas.addImage(image);
        } catch (IOException | BadElementException e) {
            throw new RuntimeException(e);
        }
    }
}

上面的代碼實(shí)現(xiàn)了兩個(gè)類:Watermark和Signature。其中,Watermark用于添加水印,Signature用于添加簽名和蓋章。這兩個(gè)類都實(shí)現(xiàn)了PdfPageEvent接口,并重寫了onEndPage方法。

在Watermark類中,我們使用ColumnText.showTextAligned來顯示水印,并使用PdfContentByte對(duì)象添加一個(gè)矩形邊框。

在Signature類中,我們先添加簽名圖片,然后添加蓋章文字。注意,在添加簽名圖片時(shí),我們需要使用Image.getInstance方法將圖片文件讀入內(nèi)存,并使用scaleAbsolute方法將其大小縮放為所需大??;在添加蓋章文字時(shí),我們使用PdfContentByte的setFontAndSize和showTextAligned方法,分別設(shè)置字體和位置。

步驟3:實(shí)現(xiàn)轉(zhuǎn)換方法

下面是一個(gè)將Word文檔轉(zhuǎn)換為PDF并添加水印、簽名和蓋章的方法:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFTable;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;

public class WordToPdfConverter {
    public static InputStream convert(String wordFilePath, String signatureImagePath, String signatureText) {
        try (FileInputStream fis = new FileInputStream(wordFilePath);
             XWPFDocument document = new XWPFDocument(fis);
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            PdfWriter writer = PdfWriter.getInstance(document, baos);
            writer.setPageEvent(new Watermark("Confidential"));
            writer.setPageEvent(new Signature(signatureImagePath, "Approved"));

            Document pdfDoc = new Document();
            pdfDoc.open();
            for (IBodyElement element : document.getBodyElements()) {
                if (element instanceof XWPFParagraph) {
                    XWPFParagraph paragraph = (XWPFParagraph) element;
                    pdfDoc.add(new Paragraph(paragraph.getText()));
                } else if (element instanceof XWPFTable) {
                    XWPFTable table = (XWPFTable) element;
                    pdfDoc.add(new Paragraph(table.getText()));
                }

                pdfDoc.newPage(); // 每一頁(yè)添加水印、簽名和蓋章
            }
            pdfDoc.close();

            return new ByteArrayInputStream(baos.toByteArray());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

上面的代碼實(shí)現(xiàn)了將Word文檔轉(zhuǎn)換為PDF并添加水印、簽名和蓋章的功能。該方法接受3個(gè)參數(shù):

wordFilePath:要轉(zhuǎn)換的Word文檔路徑。 signatureImagePath:簽名圖片路徑。 signatureText:蓋章文字內(nèi)容。 在這個(gè)方法中,我們先使用Apache POI庫(kù)讀取Word文檔,并使用OpenPDF庫(kù)創(chuàng)建一個(gè)PDF文件。然后,我們使用代碼設(shè)置頁(yè)面事件來添加水印和簽名蓋章。接下來,我們將Word文檔中的內(nèi)容逐一復(fù)制到PDF文件中,并在每一頁(yè)的末尾添加水印、簽名和蓋章。最后,我們將生成的PDF作為ByteArrayInputStream返回給調(diào)用方。

需要注意的是,由于Word文檔可能包含多種元素(如段落、表格、圖片等),因此我們需要逐一遍歷Word文檔中的不同元素,并逐頁(yè)將它們復(fù)制到PDF文件中(使用pdfDoc.newPage()方法)。

步驟4:測(cè)試代碼

下面是一個(gè)測(cè)試代碼,調(diào)用上面的方法將Word文檔轉(zhuǎn)換為PDF并添加水印、簽名和蓋章:

import java.io.FileOutputStream;
import java.io.InputStream;

public class Main {
    public static void main(String[] args) throws Exception {
        // 將Word文檔轉(zhuǎn)換為PDF并添加水印、簽名和蓋章
        InputStream pdfStream = WordToPdfConverter.convert("input.docx", "signature.png", "Approved");

        // 將PDF保存到文件
        try (FileOutputStream fos = new FileOutputStream("output.pdf")) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = pdfStream.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        }

        System.out.println("PDF generated successfully.");
    }
}

上面的代碼實(shí)現(xiàn)了將Word文檔轉(zhuǎn)換為PDF并添加水印、簽名和蓋章的測(cè)試功能。該方法將調(diào)用上面的convert方法,生成一個(gè)帶有水印、簽名和蓋章的PDF文件,并將其保存到磁盤上。

總結(jié)

本文介紹了如何使用Java將Word文檔轉(zhuǎn)換為PDF,并在生成的PDF文件中添加水印、簽名和蓋章。本文使用了Apache POI和OpenPDF兩個(gè)庫(kù)來實(shí)現(xiàn)Word和PDF之間的轉(zhuǎn)換。在實(shí)現(xiàn)過程中,我們使用了PdfPageEvent接口來添加水印和簽名,使用Apache POI庫(kù)來讀取Word文檔,使用OpenPDF庫(kù)來創(chuàng)建和編輯PDF文件。

到此這篇關(guān)于使用java實(shí)現(xiàn)pdf電子簽章功能的文章就介紹到這了,更多相關(guān)java pdf電子簽章內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中請(qǐng)求入?yún)㈩愋娃D(zhuǎn)換的6種玩法

    SpringBoot中請(qǐng)求入?yún)㈩愋娃D(zhuǎn)換的6種玩法

    做 Spring Boot Web 開發(fā)的小伙伴,想必都做過請(qǐng)求入?yún)㈩愋娃D(zhuǎn)換吧,本文將和大家詳細(xì)介紹一下SpringBoot參數(shù)類型轉(zhuǎn)換的6種玩法,希望對(duì)大家有所幫助
    2026-02-02
  • Java Development Kit(JDK)使用及說明

    Java Development Kit(JDK)使用及說明

    文章介紹了JDK(Java開發(fā)工具包)的定義、功能及與JRE、JVM的區(qū)別,強(qiáng)調(diào)JDK包含開發(fā)工具和庫(kù),適合開發(fā)者,而JRE僅用于運(yùn)行程序,同時(shí)概述了JDK23版本新增特性及安裝步驟
    2025-09-09
  • 詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面

    詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面

    這篇文章主要介紹了詳解如何配置springboot跳轉(zhuǎn)html頁(yè)面,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot整合多個(gè)Mq服務(wù)做法詳解

    SpringBoot整合多個(gè)Mq服務(wù)做法詳解

    SpringBoot整合rabbitmq很容易,但是整合的目的是為了使用,那要使用rabbitmq就要對(duì)其有一定的了解,不然容易整成一團(tuán)漿糊。因?yàn)檎f到底,SpringBoot只是在封裝rabbitmq的API,讓其更容易使用而已,廢話不多說,讓我們一起整它
    2023-02-02
  • Springboot攔截filter中異常的處理

    Springboot攔截filter中異常的處理

    SpringBoot提供了全局異常處理機(jī)制可以攔截所有異常,包括Filter中的異常,本文主要介紹了Springboot攔截filter中異常的處理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Java中MyBatis的結(jié)果映射詳解

    Java中MyBatis的結(jié)果映射詳解

    這篇文章主要介紹了Java中MyBatis的結(jié)果映射詳解,MyBatis 支持對(duì)各種單表查詢、關(guān)聯(lián)查詢等各種復(fù)雜查詢的結(jié)果進(jìn)行映射,MyBatis 是一款優(yōu)秀的持久層框架,它的強(qiáng)大之處正是 SQL 語(yǔ)句映射,這一章介紹常用的結(jié)果映射,需要的朋友可以參考下
    2023-08-08
  • spring帶bean和config如何通過main啟動(dòng)測(cè)試

    spring帶bean和config如何通過main啟動(dòng)測(cè)試

    這篇文章主要介紹了spring帶bean和config,通過main啟動(dòng)測(cè)試,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java中的線程死鎖是什么?如何避免?

    Java中的線程死鎖是什么?如何避免?

    這篇文章主要介紹了Java中線程死鎖的相關(guān)資料,以及避免死鎖的方法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • springboot整合mybatis分頁(yè)攔截器的問題小結(jié)

    springboot整合mybatis分頁(yè)攔截器的問題小結(jié)

    springboot整合mybatis分頁(yè)攔截器,分頁(yè)攔截實(shí)際上就是獲取sql后將sql拼接limit,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • Netty分布式Server啟動(dòng)流程服務(wù)端初始化源碼分析

    Netty分布式Server啟動(dòng)流程服務(wù)端初始化源碼分析

    本章主要講解server啟動(dòng)的關(guān)鍵步驟,?讀者只需要了解server啟動(dòng)的大概邏輯,?知道關(guān)鍵的步驟在哪個(gè)類執(zhí)行即可,?并不需要了解每一步的運(yùn)作機(jī)制,?之后會(huì)對(duì)每個(gè)模塊進(jìn)行深度分析
    2022-03-03

最新評(píng)論

安多县| 台中市| 敦化市| 临猗县| 临江市| 邹城市| 盐边县| 于都县| 涟水县| 墨江| 都昌县| 南平市| 永康市| 黔西| 金沙县| 铜鼓县| 翁牛特旗| 梨树县| 上思县| 甘孜县| 闵行区| 青铜峡市| 伊川县| 翁牛特旗| 和平县| 枣阳市| 青海省| 唐山市| 古浪县| 罗江县| 秀山| 宁晋县| 彭阳县| 松阳县| 灵川县| 晋江市| 忻州市| 黑龙江省| 仁怀市| 湖州市| 定襄县|