您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何使用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(); } } } } }
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一致
我的原始pdf中含有關鍵字申請時間
,修改前后文件內容如下:
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”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。