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

Java實(shí)現(xiàn)圖章或簽名插在pdf的固定位置

 更新時(shí)間:2023年10月20日 09:52:07   作者:一紙紅塵輕似夢(mèng)  
使用Java技術(shù)在word轉(zhuǎn)換成pdf過(guò)程中實(shí)現(xiàn)將圖章或者簽名插入在pdf中,并生成帶圖章或者簽名的pdf,來(lái)完成某些特定場(chǎng)景的需求,文中有詳細(xì)的代碼示例,需要的朋友可以參考下

提示:以下是本篇文章正文內(nèi)容,下面案例本人親自驗(yàn)證過(guò),并已解決該需求

一、引入pom依賴

  • 引入pdf插入圖章的依賴包
		 <!--pdf轉(zhuǎn)圖片-->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.12</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.12</version>
        </dependency>

二、編寫(xiě)插入圖章或者簽名位置的類

  • 創(chuàng)建PdfBoxKeyWordPosition類并繼承PDFTextStripper
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class PdfBoxKeyWordPosition extends PDFTextStripper {

    // 關(guān)鍵字字符數(shù)組
    private char[] key;
    // PDF文件路徑
    private String pdfPath;
    // 坐標(biāo)信息集合
    private List<float[]> list = new ArrayList<float[]>();
    // 當(dāng)前頁(yè)信息集合
    private List<float[]> pagelist = new ArrayList<float[]>();
    // 有參構(gòu)造方法
    public PdfBoxKeyWordPosition(String keyWords, String pdfPath) throws IOException {
        super();
        super.setSortByPosition(true);
        this.pdfPath = pdfPath;
        char[] key = new char[keyWords.length()];
        for (int i = 0; i < keyWords.length(); i++) {
            key[i] = keyWords.charAt(i);
        }
        this.key = key;
    }
    public char[] getKey() {
        return key;
    }
    public void setKey(char[] key) {
        this.key = key;
    }
    public String getPdfPath() {
        return pdfPath;
    }
    public void setPdfPath(String pdfPath) {
        this.pdfPath = pdfPath;
    }
    // 獲取坐標(biāo)信息
    public List<float[]> getCoordinate() throws IOException {
        try {
            document = PDDocument.load(new File(pdfPath));
            int pages = document.getNumberOfPages();
            for (int i = 1; i <= pages; i++) {
                pagelist.clear();
                super.setSortByPosition(true);
                super.setStartPage(i);
                super.setEndPage(i);
                Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream());
                super.writeText(document, dummy);
                for (float[] li : pagelist) {
                    li[2] = i;
                }
                list.addAll(pagelist);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                document.close();
            }
        }
        return list;
    }

    // 獲取坐標(biāo)信息
    @Override
    protected void writeString(String string, List<TextPosition> textPositions) throws IOException {
        for (int i = 0; i < textPositions.size(); i++) {
            // text得到pdf這一行中的漢字,同時(shí)下面有判斷這一行字的長(zhǎng)度,防止關(guān)鍵字在文中多次出現(xiàn)
            String text = textPositions.toString().replaceAll("[^\u4E00-\u9FA5]", "");
            String str = textPositions.get(i).getUnicode();
            if (str.equals(key[0] + "")) {
                int count = 0;
                for (int j = 0; j < key.length; j++) {
                    String s = "";
                    try {
                        s = textPositions.get(i + j).getUnicode();
                    } catch (Exception e) {
                        s = "";
                    }
                    if (s.equals(key[j] + "")) {
                        count++;
                    }
                }
                if (count == key.length) {
                    float[] idx = new float[3];
                    // 需要進(jìn)行一些調(diào)整 使得章蓋在字體上
                    // X坐標(biāo) 在這里加上了字體的長(zhǎng)度,也可以直接 idx[0] = textPositions.get(i).getX()
                    idx[0] = textPositions.get(i).getX();
                    // Y坐標(biāo) 在這里減去的字體的長(zhǎng)度,也可以直接 idx[1] = textPositions.get(i).getPageHeight()-textPositions.get(i).getY()
                    idx[1] = textPositions.get(i).getPageHeight()-textPositions.get(i).getY();
                    System.out.println("x=" + idx[0] + ",y=" + idx[1]);
                    pagelist.add(idx);
                }
            }
        }
    }
}

三、編寫(xiě)插入圖章或者簽名位置的方法

/**
     * 說(shuō)明:將圖章插入到pdf上
     * @param pdfPath  pdf的路徑:C:\Users\user\11134731700024.pdf
     * @param image  圖片路徑:C:\Users\user\131123.jpg
     * @throws IOException
     */
  public static void operate(String pdfPath,String image) throws IOException {
        File file = new File(pdfPath);
        PDDocument doc = PDDocument.load(file);
        String keyWords = "插入到pdf的固定字體"; // 修改成你需要插入的位置
        PDImageXObject pdImage = PDImageXObject.createFromFile(image, doc);
        PdfBoxKeyWordPosition pdf = new PdfBoxKeyWordPosition(keyWords, pdfPath);
        PDPageContentStream contentStream = null;
        List<float[]> list = pdf.getCoordinate();
        // 多頁(yè)pdf的處理
        for (float[] fs : list) {
            PDPage page = doc.getPage((int)fs[2]-1);
            float x = fs[0];
            float y = fs[1];
            contentStream = new PDPageContentStream(doc, page, true, true);
            contentStream.drawImage(pdImage, x-11, y-35,112,112);
            contentStream.close();
        }
        doc.save(pdfPath);
        doc.close();

    }

 	/**
     * 插入簽名
     * @param pdfPath  pdf的路徑:C:\Users\user\11134731700024.pdf
     * @param keyWords 簽名修改成你需要簽名的地方(如:傳入張三就會(huì)蓋在張三上)
     * @param image     簽名圖片 C:\Users\user\131123.jpg
     * @throws IOException
     */
    public static void autograph(String pdfPath, String keyWords, String image) throws IOException {
        File file = new File(pdfPath);
        PDDocument doc = PDDocument.load(file);
        PDImageXObject pdImage = PDImageXObject.createFromFile(image, doc);
        PdfBoxKeyWordPosition pdf = new PdfBoxKeyWordPosition(keyWords, pdfPath);
        PDPageContentStream contentStream = null;
        List<float[]> list = pdf.getCoordinate();
        // 多頁(yè)pdf的處理
        for (float[] fs : list) {
            PDPage page = doc.getPage((int)fs[2]-1);
            float x = fs[0];
            float y = fs[1];
            contentStream = new PDPageContentStream(doc, page, true, true);
            contentStream.drawImage(pdImage, x+36, y-2,35,20);
            contentStream.close();
        }

        doc.save(pdfPath);
        doc.close();

    }





四、測(cè)試兩個(gè)方法

public static void main(String[] args) throws IOException {
        System.out.println("開(kāi)始圖章插入");
        operate("C:\\Users\\user\\Desktop\\11134731700024.pdf", "C:\\Users\\user\\Desktop\\131123.jpg");
        System.out.println("插入結(jié)束");
    System.out.println("開(kāi)始簽名插入");
        autograph("C:\\Users\\user\\Desktop\\11134731700024.pdf","插入簽名的位置(pdf上的文字)", "C:\\Users\\user\\123456789\\131123.jpg");
    }
    System.out.println("結(jié)束簽名插入");

出現(xiàn)坐標(biāo)插入成功。打開(kāi)文件就可以看到了

到此這篇關(guān)于Java實(shí)現(xiàn)圖章或簽名插在pdf的固定位置的文章就介紹到這了,更多相關(guān)Java圖章或簽名插在pdf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用動(dòng)態(tài)代理和反射實(shí)現(xiàn)字段變更跟蹤的方案

    Java使用動(dòng)態(tài)代理和反射實(shí)現(xiàn)字段變更跟蹤的方案

    該文章介紹了如何使用Java動(dòng)態(tài)代理和反射技術(shù)來(lái)跟蹤記錄對(duì)象字段的變更前和變更后的數(shù)據(jù),文章詳細(xì)講解了創(chuàng)建變更記錄數(shù)據(jù)結(jié)構(gòu)、變更跟蹤處理器、代理工廠,并通過(guò)示例展示了如何使用和運(yùn)行這個(gè)代理,需要的朋友可以參考下
    2025-12-12
  • 三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法

    三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法

    這篇文章主要介紹了三分鐘教你如何在IDEA中快速創(chuàng)建工程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java?中?get?和?set?方法詳解及實(shí)現(xiàn)細(xì)節(jié)

    Java?中?get?和?set?方法詳解及實(shí)現(xiàn)細(xì)節(jié)

    本文詳細(xì)介紹了Java中g(shù)et和set方法的使用,包括它們?cè)诿嫦驅(qū)ο缶幊讨械淖饔谩⒚?guī)范、實(shí)現(xiàn)細(xì)節(jié)、使用場(chǎng)景以及常見(jiàn)問(wèn)題的解決方案,通過(guò)遵循這些最佳實(shí)踐,可以提高代碼的可維護(hù)性、封裝性和可讀性,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • J2EE中的struts2表單細(xì)節(jié)處理

    J2EE中的struts2表單細(xì)節(jié)處理

    這篇文章主要介紹了J2EE中的struts2表單細(xì)節(jié)處理的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java8 Instant 時(shí)間戳實(shí)例講解

    Java8 Instant 時(shí)間戳實(shí)例講解

    Instant類是Java8 中補(bǔ)充的一個(gè) 時(shí)間戳類,nstant 可以使用靜態(tài)方法 now()或者of()方法來(lái)創(chuàng)建一個(gè)實(shí)例對(duì)象,本文通過(guò)實(shí)例代碼講解Java8 Instant 時(shí)間戳,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Java8加java10等于Java18的版本查看及特性詳解

    Java8加java10等于Java18的版本查看及特性詳解

    這篇文章主要為大家介紹了Java?8加java10等于Java18的各個(gè)版本要點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 打包SpringBoot程序?yàn)閑xe的案例教程

    打包SpringBoot程序?yàn)閑xe的案例教程

    這篇文章主要介紹了打包SpringBoot程序?yàn)閑xe的案例教程,文中通過(guò)圖文講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • MyBatis二級(jí)緩存實(shí)現(xiàn)關(guān)聯(lián)刷新

    MyBatis二級(jí)緩存實(shí)現(xiàn)關(guān)聯(lián)刷新

    本文主要介紹了MyBatis二級(jí)緩存實(shí)現(xiàn)關(guān)聯(lián)刷新,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • JDK10新特性之本地變量類型var的深入理解

    JDK10新特性之本地變量類型var的深入理解

    這篇文章主要給大家介紹了J關(guān)于DK10新特性之本地變量類型var的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JDK10具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Sentinel流控規(guī)則實(shí)現(xiàn)限流保護(hù)詳解

    Sentinel流控規(guī)則實(shí)現(xiàn)限流保護(hù)詳解

    這篇文章主要介紹了Sentinel流控規(guī)則實(shí)現(xiàn)限流保護(hù),Sentinel是一個(gè)分布式系統(tǒng)的流量控制組件,它可以實(shí)現(xiàn)限流,流控,降級(jí)等功能,提高系統(tǒng)的穩(wěn)定性和可靠性,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05

最新評(píng)論

磴口县| 达孜县| 云梦县| 铁岭县| 康马县| 时尚| 斗六市| 出国| 米泉市| 湘阴县| 都匀市| 枝江市| 青河县| 临漳县| 明水县| 金溪县| 洛川县| 乌拉特后旗| 宣威市| 唐海县| 镇康县| 东乡族自治县| 东丽区| 武城县| 阜宁县| 大石桥市| 恩平市| 拉萨市| 贵阳市| 石城县| 观塘区| 东方市| 九江市| 安徽省| 都匀市| 肃南| 修文县| 佛冈县| 吉水县| 汪清县| 石台县|