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

教你怎么用Java通過(guò)關(guān)鍵字修改pdf

 更新時(shí)間:2021年05月14日 15:42:14   作者:小科比000  
此方法只適合通過(guò)關(guān)鍵字位置,在pdf上添加字符直接上代碼,代碼比較長(zhǎng),大部分自己的理解都在代碼注釋中了,需要的朋友可以參考下

一、前言

在main方法中測(cè)試該方法,還需要引用的jar包有itextpdf-5.5.10.jar、itext-asian-5.2.0.jar
注意:兩jar包之間有版本對(duì)應(yīng),否則會(huì)出現(xiàn)報(bào)錯(cuò),該報(bào)錯(cuò)主要針對(duì)設(shè)置中文字體的方法
java itext 報(bào)錯(cuò) com.itextpdf.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H'

import com.itextpdf.text.Chunk;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * @Desc
 * @Author madengling
 * @Time 2021/5/11 15:18
 */
public class UpdatePdf {

    public static void main(String[] args) {
        File file = new File("G://files//cs//111.pdf");//模擬文件位置
        if(file!=null && file.exists()){
            FileInputStream is = null;
            try {
                //本地根據(jù)文件路徑獲取文件流
                is = new FileInputStream(file);
                long length = file.length();
                byte[] fileBytes = new byte[(int)length];
                is.read(fileBytes);
                //進(jìn)行pdf文件修改
                File file1 = pdfFzSqsj(fileBytes);
                if(file1!=null && file1.exists()){
                    System.out.println("修改pdf完成!");
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    /**
     * 根據(jù)pdf的固定關(guān)鍵字,查找進(jìn)行pdf相關(guān)位置增加文字
     * @param tpeHtcxyw 文件流
     * @return 修改后的文件
     */
    private static File pdfFzSqsj(byte[] tpeHtcxyw) {
        PdfStamper stamper = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
            //獲取要寫(xiě)入的申請(qǐng)時(shí)間
            String sj  =sdf.format(new Date());
            PdfReader reader = new PdfReader(tpeHtcxyw);
            //創(chuàng)建文件路徑
			String filePath = "G://files/cs/";
            System.out.println("filePath="+filePath);
            File directory = new File(filePath);
            //如果pdf保存路徑不存在,則創(chuàng)建路徑
            if (!directory.exists()) {
                directory.mkdirs();
            }
            String filename = UUID.randomUUID()+"_after.pdf";//修改后文件
			String filename1 = UUID.randomUUID()+"_before.pdf";//修改前文件 再輸出一遍,校驗(yàn)自己在修改之前拿到正確的文件流
            System.out.println("file:"+filePath+filename);
            File file = new File(filePath+filename);
			File file1 = new File(filePath+filename1);
            //將寫(xiě)入臨時(shí)文件
			FileOutputStream  foss = new FileOutputStream (file1);
			foss.write(tpeHtcxyw);
			foss.close();
            //設(shè)置字體
            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
            Font font = new Font(baseFont);
            stamper = new PdfStamper(reader, new FileOutputStream(file));
            //對(duì)于已經(jīng)固話的pdf回填申請(qǐng)時(shí)間
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                PdfContentByte over = stamper.getOverContent(i);
                ColumnText columnText = new ColumnText(over);
                if(i==1){
                    String str = "申請(qǐng)日期:";
                    //根據(jù)關(guān)鍵字獲取關(guān)鍵字位置
                    float[] po =  Html2Pdf.getGzzzb(str,tpeHtcxyw);
                    if(po[0]==1.00f){
                        // 方法setSimpleColumn(float llx, float lly, float urx, float ury)
                        // llx 和 urx  最小的值決定離左邊的距離. lly 和 ury 最大的值決定離下邊的距離
                        columnText.setSimpleColumn( po[1]+46f,  po[2]-9f, 500, 0);
                        //將時(shí)間文本創(chuàng)建成對(duì)象
                        Paragraph elements = new Paragraph(0, new Chunk(new Chunk(sj)));
                        // 設(shè)置字體,如果不設(shè)置添加的中文將無(wú)法顯示
                        elements.setFont(font);
                        columnText.addElement(elements);
                        columnText.go();
                    }
                }
            }
            return file;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            if(stamper!=null){
                try {
                    stamper.close();
                } catch (DocumentException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

二、Html2Pdf

import com.itextpdf.awt.geom.Rectangle2D;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;

public class Html2Pdf {
    /**
     * 定位pdf文件中關(guān)鍵字坐標(biāo)
     * @param signKey 關(guān)鍵字
     * @param pdf 文件流
     * @return 坐標(biāo)位置
     */
    public static float[] getGzzzb(String signKey, byte[] pdf){
        PdfReader reader=null;
        final float[] po = new float[3];
        try{
            reader = new PdfReader(pdf);
            int pageNum = reader.getNumberOfPages();
            final String signKeyWord = signKey;
            for(int page=1; page <= pageNum; page++){
                PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(reader);
                pdfReaderContentParser.processContent(page, new RenderListener() {
                    StringBuilder sb = new StringBuilder("");
                    int maxLength = signKeyWord.length();
                    @Override
                    public void renderText(TextRenderInfo textRenderInfo) {
                        // 只適用 單字塊文檔 以及 關(guān)鍵字整個(gè)為一個(gè)塊的情況
                        // 設(shè)置 關(guān)鍵字文本為單獨(dú)的塊,不然會(huì)錯(cuò)位
                        boolean isKeywordChunk = textRenderInfo.getText().length() == maxLength;
                        if (isKeywordChunk) {
                            // 文檔按照 塊 讀取
                            sb.delete(0, sb.length());
                            sb.append(textRenderInfo.getText());
                        } else {
                            // 有些文檔 單字一個(gè)塊的情況
                            // 拼接字符串
                            sb.append(textRenderInfo.getText());
                            // 去除首部字符串,使長(zhǎng)度等于關(guān)鍵字長(zhǎng)度
                            if (sb.length() > maxLength) {
                                sb.delete(0, sb.length() - maxLength);
                            }
                        }
                        // 判斷是否匹配上
                        if (signKeyWord.equals(sb.toString())) {
                            // 計(jì)算中心點(diǎn)坐標(biāo)
                            Rectangle2D.Float baseFloat = textRenderInfo.getBaseline()
                                    .getBoundingRectange();
                            Rectangle2D.Float ascentFloat = textRenderInfo.getAscentLine()
                                    .getBoundingRectange();
                            float centreX;
                            float centreY;
                            if (isKeywordChunk) {
                                centreX = baseFloat.x + 5*ascentFloat.width / 6;
                                centreY = baseFloat.y + (5*(ascentFloat.y - baseFloat.y) / 6);
                            } else {
                                centreX = baseFloat.x + ascentFloat.width - (5*maxLength * ascentFloat.width / 6);
                                centreY = baseFloat.y + (5*(ascentFloat.y - baseFloat.y) / 6);
                            }
                            po[0]=1.00f;
                            po[1]=centreX+3;
                            po[2]=centreY;
                            // 匹配完后 清除
                            sb.delete(0, sb.length());
                        }
                    }
                    @Override
                    public void renderImage(ImageRenderInfo arg0) {}
                    @Override
                    public void endTextBlock() {}
                    @Override
                    public void beginTextBlock() {}
                });
            }
            if(po[0]==1.00f){
                return po;
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(reader!=null){
                reader.close();
            }
        }
        return null;
    }

三、結(jié)果圖

111.pdf是原始文件,其余兩文件在方法執(zhí)行后生成,before文件內(nèi)容與111.pdf一致

在這里插入圖片描述

我的原始pdf中含有關(guān)鍵字申請(qǐng)時(shí)間,修改前后文件內(nèi)容如下:

在這里插入圖片描述
在這里插入圖片描述

到此這篇關(guān)于教你怎么用Java通過(guò)關(guān)鍵字修改pdf的文章就介紹到這了,更多相關(guān)關(guān)鍵字修改pdf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • HDFS中JAVA API的使用

    HDFS中JAVA API的使用

    HDFS是一個(gè)分布式文件系統(tǒng),既然是文件系統(tǒng),就可以對(duì)其文件進(jìn)行操作,比如說(shuō)新建文件、刪除文件、讀取文件內(nèi)容等操作。下面記錄一下使用JAVA API對(duì)HDFS中的文件進(jìn)行操作的過(guò)程
    2017-07-07
  • 淺談Mybatis分頁(yè)插件,自定義分頁(yè)的坑

    淺談Mybatis分頁(yè)插件,自定義分頁(yè)的坑

    這篇文章主要介紹了淺談Mybatis分頁(yè)插件,自定義分頁(yè)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Spring MVC 與 CORS跨域的詳細(xì)介紹

    Spring MVC 與 CORS跨域的詳細(xì)介紹

    本文介紹了 CORS 的知識(shí)以及如何在 Spring MVC 中配置 CORS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 解決SpringBoot跨域的三種方式

    解決SpringBoot跨域的三種方式

    前后端分離是目前的趨勢(shì),解決跨域問(wèn)題也是老生常談的話題了,我們了解一下什么是域和跨域。域:協(xié)議 + 域名 + 端口;三者完全相同則為同域,反之有其一不同均為不同域??缬蛘?qǐng)求:當(dāng)前【發(fā)起請(qǐng)求】的域和【請(qǐng)求指向】的域?qū)儆诓煌驎r(shí),該次請(qǐng)求稱(chēng)之為跨域請(qǐng)求
    2021-06-06
  • SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    這篇文章主要介紹了SpringBoot中的@ConditionalOnMissingBean注解使用詳解,@ConditionalOnMissingBean作用在@Bean定義上,也就是說(shuō)在容器加載它作用的Bean時(shí),檢查容器中是否存在目標(biāo)類(lèi)型,需要的朋友可以參考下
    2024-01-01
  • logback的使用和logback.xml詳解(小結(jié))

    logback的使用和logback.xml詳解(小結(jié))

    Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個(gè)開(kāi)源日志組件,這篇文章主要介紹了logback的使用和logback.xml詳解(小結(jié)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • 基于Java實(shí)現(xiàn)緩存Cache的深入分析

    基于Java實(shí)現(xiàn)緩存Cache的深入分析

    本篇文章是對(duì)Java實(shí)現(xiàn)緩存Cache進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Java代碼如何判斷l(xiāng)inux系統(tǒng)windows系統(tǒng)

    Java代碼如何判斷l(xiāng)inux系統(tǒng)windows系統(tǒng)

    這篇文章主要介紹了Java代碼如何判斷l(xiāng)inux系統(tǒng)windows系統(tǒng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 自定義指定路由上的Gateway過(guò)濾器工廠詳解

    自定義指定路由上的Gateway過(guò)濾器工廠詳解

    這篇文章主要介紹了自定義指定路由上的Gateway過(guò)濾器工廠詳解,gateway是Spring?Cloud中的一個(gè)網(wǎng)關(guān)服務(wù),gateway可以使用服務(wù)注冊(cè)中心進(jìn)行服務(wù)發(fā)現(xiàn)和負(fù)載均衡,同時(shí)還可以配置斷言來(lái)判斷請(qǐng)求是否符合路由規(guī)則,需要的朋友可以參考下
    2023-09-09
  • Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法示例

    Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了java針對(duì)Excel的讀寫(xiě)及數(shù)據(jù)庫(kù)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08

最新評(píng)論

郧西县| 会昌县| 宣恩县| 河间市| 常山县| 和平县| 衡阳县| 康保县| 西丰县| 无为县| 美姑县| 民权县| 平阳县| 河间市| 奈曼旗| 忻城县| 大余县| 邢台市| 沂源县| 松原市| 钟山县| 柳林县| 克什克腾旗| 东阿县| 手游| 壤塘县| 兴国县| 阿城市| 锡林郭勒盟| 苏尼特右旗| 丰原市| 桑植县| 岳普湖县| 瓮安县| 牡丹江市| 额敏县| 肇州县| 安泽县| 霍山县| 乐陵市| 安仁县|