91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Java通過關鍵字修改pdf

發布時間:2021-05-17 13:48:17 來源:億速云 閱讀:645 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關如何使用Java通過關鍵字修改pdf的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、前言

在main方法中測試該方法,還需要引用的jar包有itextpdf-5.5.10.jar、itext-asian-5.2.0.jar
注意:兩jar包之間有版本對應,否則會出現報錯,該報錯主要針對設置中文字體的方法
java itext 報錯 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 {
                //本地根據文件路徑獲取文件流
                is = new FileInputStream(file);
                long length = file.length();
                byte[] fileBytes = new byte[(int)length];
                is.read(fileBytes);
                //進行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();
                    }
                }
            }
        }
    }

    /**
     * 根據pdf的固定關鍵字,查找進行pdf相關位置增加文字
     * @param tpeHtcxyw 文件流
     * @return 修改后的文件
     */
    private static File pdfFzSqsj(byte[] tpeHtcxyw) {
        PdfStamper stamper = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
            //獲取要寫入的申請時間
            String sj  =sdf.format(new Date());
            PdfReader reader = new PdfReader(tpeHtcxyw);
            //創建文件路徑
			String filePath = "G://files/cs/";
            System.out.println("filePath="+filePath);
            File directory = new File(filePath);
            //如果pdf保存路徑不存在,則創建路徑
            if (!directory.exists()) {
                directory.mkdirs();
            }
            String filename = UUID.randomUUID()+"_after.pdf";//修改后文件
			String filename1 = UUID.randomUUID()+"_before.pdf";//修改前文件 再輸出一遍,校驗自己在修改之前拿到正確的文件流
            System.out.println("file:"+filePath+filename);
            File file = new File(filePath+filename);
			File file1 = new File(filePath+filename1);
            //將寫入臨時文件
			FileOutputStream  foss = new FileOutputStream (file1);
			foss.write(tpeHtcxyw);
			foss.close();
            //設置字體
            BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
            Font font = new Font(baseFont);
            stamper = new PdfStamper(reader, new FileOutputStream(file));
            //對于已經固話的pdf回填申請時間
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                PdfContentByte over = stamper.getOverContent(i);
                ColumnText columnText = new ColumnText(over);
                if(i==1){
                    String str = "申請日期:";
                    //根據關鍵字獲取關鍵字位置
                    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);
                        //將時間文本創建成對象
                        Paragraph elements = new Paragraph(0, new Chunk(new Chunk(sj)));
                        // 設置字體,如果不設置添加的中文將無法顯示
                        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文件中關鍵字坐標
     * @param signKey 關鍵字
     * @param pdf 文件流
     * @return 坐標位置
     */
    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) {
                        // 只適用 單字塊文檔 以及 關鍵字整個為一個塊的情況
                        // 設置 關鍵字文本為單獨的塊,不然會錯位
                        boolean isKeywordChunk = textRenderInfo.getText().length() == maxLength;
                        if (isKeywordChunk) {
                            // 文檔按照 塊 讀取
                            sb.delete(0, sb.length());
                            sb.append(textRenderInfo.getText());
                        } else {
                            // 有些文檔 單字一個塊的情況
                            // 拼接字符串
                            sb.append(textRenderInfo.getText());
                            // 去除首部字符串,使長度等于關鍵字長度
                            if (sb.length() > maxLength) {
                                sb.delete(0, sb.length() - maxLength);
                            }
                        }
                        // 判斷是否匹配上
                        if (signKeyWord.equals(sb.toString())) {
                            // 計算中心點坐標
                            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;
    }

三、結果圖

111.pdf是原始文件,其余兩文件在方法執行后生成,before文件內容與111.pdf一致

如何使用Java通過關鍵字修改pdf

我的原始pdf中含有關鍵字申請時間,修改前后文件內容如下:

如何使用Java通過關鍵字修改pdf
如何使用Java通過關鍵字修改pdf

常用的java框架有哪些

1.SpringMVC,Spring Web MVC是一種基于Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架。2.Shiro,Apache Shiro是Java的一個安全框架。3.Mybatis,MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。4.Dubbo,Dubbo是一個分布式服務框架。5.Maven,Maven是個項目管理和構建自動化工具。6.RabbitMQ,RabbitMQ是用Erlang實現的一個高并發高可靠AMQP消息隊列服務器。7.Ehcache,EhCache 是一個純Java的進程內緩存框架。

感謝各位的閱讀!關于“如何使用Java通過關鍵字修改pdf”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江山市| 会泽县| 太仓市| 东乌珠穆沁旗| 黄冈市| 博罗县| 铜陵市| 潞城市| 都安| 高州市| 桦川县| 江津市| 墨江| 抚州市| 边坝县| 常熟市| 广元市| 五常市| 枝江市| 城步| 翼城县| 锡林郭勒盟| 墨脱县| 文山县| 嘉峪关市| 横山县| 咸阳市| 新丰县| 光泽县| 梨树县| 凤庆县| 庆安县| 阿瓦提县| 石棉县| 游戏| 定日县| 满洲里市| 镇康县| 石城县| 巴林左旗| 乃东县|