生成PDF全攻略之在已有PDF上添加內容

来源:http://www.cnblogs.com/java-class/archive/2016/06/03/5555494.html
-Advertisement-
Play Games

項目在變,需求在變,不變的永遠是敲擊鍵盤的程式員..... PDF 生成後,有時候需要在PDF上面添加一些其他的內容,比如文字,圖片.... 經歷幾次失敗的嘗試,終於獲取到了正確的代碼書寫方式。 在此記錄總結,方便下次以不變應萬變,需要的 jar 請移步:生成PDF全攻略 上述的這段代碼算是在原有 ...


     項目在變,需求在變,不變的永遠是敲擊鍵盤的程式員.....

     PDF 生成後,有時候需要在PDF上面添加一些其他的內容,比如文字,圖片....

     經歷幾次失敗的嘗試,終於獲取到了正確的代碼書寫方式。

     在此記錄總結,方便下次以不變應萬變,需要的 jar 請移步:生成PDF全攻略

        PdfReader reader = new PdfReader("E:\\A.pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("E:\\B.pdf"));
        PdfContentByte overContent = stamper.getOverContent(1);

    上述的這段代碼算是在原有 PDF 上面添加內容的核心代碼,具體流程如下

  • 如果看官老爺夠仔細的話,該代碼是將原 A.pdf 讀取,然後將它寫入 B.pdf,然後操作 B.pdf。
  • 可能有的看官老爺會說,將 A 讀取,然後在寫入 A 中,這樣肯定是不行的,在讀取的時候 A 已經被載入了,不能進行修改。
  • 我不喜歡這種方式,因為原 PDF 的信息已經存儲在資料庫中,其中包括 PDF 的伺服器路徑、舊名稱、新名稱、類型......
  • 這樣就會多出一次資料庫變更操作,因為這裡PDF名稱需要變更,而且鬼知道後續需求還會怎麼變。
  • 這裡急需 只在 PDF 中添加內容,其他的什麼都不變,將代碼稍微調整了一下。
        FileUtil.fileChannelCopy(A.pdf,A + "tmp".pdf));
        PdfReader reader = new PdfReader(A + "tmp".pdf);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(A.pdf));
        PdfContentByte overContent = stamper.getOverContent(1);

    代碼流程就變做下麵這個樣子

  • 這裡引入了管道複製文件,將A 複製一份,讀取副本,然後寫回到原 PDF A 中,最後當然需要刪除副本文件。
  • 到這裡,無論後續需求怎麼變,保證了pdf 的其他屬性不變,就能從容面對。

     管道複製代碼如下:

    public static void fileChannelCopy(File sources, File dest) {
        try {
            FileInputStream inputStream = new FileInputStream(sources);
            FileOutputStream outputStream = new FileOutputStream(dest);
            FileChannel fileChannelin = inputStream.getChannel();//得到對應的文件通道
            FileChannel fileChannelout = outputStream.getChannel();//得到對應的文件通道
            fileChannelin.transferTo(0, fileChannelin.size(), fileChannelout);//連接兩個通道,並且從in通道讀取,然後寫入out通道

            inputStream.close();
            fileChannelin.close();
            outputStream.close();
            fileChannelout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

      完整的在已有PDF添加其他內容代碼如下:

        FileUtil.fileChannelCopy(new File("E:\\A.pdf"),new File("E:\\A+"tmp".pdf"));
        PdfReader reader = new PdfReader("E:\\A+"tmp".pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("E:\\A.pdf"));
        PdfContentByte overContent = stamper.getOverContent(1);

        //添加文字
        BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        overContent.beginText();
        overContent.setFontAndSize(font, 10);
        overContent.setTextMatrix(200, 200);
        overContent.showTextAligned(Element.ALIGN_CENTER,"需要添加的文字",580,530,0);
        overContent.endText();

        //添加圖片
        PdfDictionary pdfDictionary = reader.getPageN(1);
        PdfObject pdfObject =  pdfDictionary.get(new PdfName("MediaBox"));
        PdfArray pdfArray = (PdfArray) pdfObject;
        Image image = Image.getInstance("D:\\1.jpg");
        image.setAbsolutePosition(100,100);
        overContent.addImage(image);

        //添加一個紅圈
        overContent.setRGBColorStroke(0xFF, 0x00, 0x00);
        overContent.setLineWidth(5f);
        overContent.ellipse(250, 450, 350, 550);
        overContent.stroke();
        stamper.close();

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為一個豬拱性能的程式猿,不會使用fiddler來協助自己分析問題是萬萬不能的。還記得剛入職的時候老大提過的幾個必須要熟練使用的工具中第一個就是fiddler。雖然接觸了快一年了,但是還是一知半解的。下午找同事幫忙分析了個記憶體溢出的問題,剛學了一招如何使用fiddler來分析oom類問題。當然以下內 ...
  • 問題背景:在使用普通的SelfHost時,調用其它工程的dll(其實就是把WebApi寫到一個單獨的工程方便管理),通過載入其他工程的dll然後再訪問webapi是沒有問題的。 但是在使用Owin SelfHost時,調用其它工程的dll,訪問WebApi時會拋出No type was found ...
  • 輔助器方法 在開發ASP.NET MVC項目時,經常會用到輔助器方法,它能夠提供很多遍歷的工作,比如可以對代碼塊和標記進行打包等。下麵通過新建一個示例項目來看看其在實際使用中的情況。 示例項目 項目名:HelperMethods 模板:Basic(基本) 項目名:HelperMethods 模板:B ...
  • 前言 最近這段時間除了工作,所有的時間都是在移植我以前實現的一個Owin框架,相當移植到到Core的話肯定會有很多坑,這個大家都懂,以後幾篇文章可能會圍繞這個說下,暫時就叫《Dotnet Core踩坑記》吧,呵呵。 接下來我對我在移植過程中發現的一些問題進行了總結,今天主要說說Owin。說到Owin ...
  • 創建自定義視圖引擎 一般情況下直接使用MVC框架自帶的內建視圖引擎即可,但如果想知道視圖引擎是如何工作的,就需要從建立一個自定義視圖引擎開始了。通過之前的學習我們都知道了內建視圖引擎包括Razor和ASPX兩種,ASPX是針對舊版本MVC程式的,他主要是維護舊版本MVC應用程式,保持系統的相容性而保 ...
  • 我們可以使用jdk內置的 Locale 類來實現java語言的國際化。使用方法很簡單: 命名格式為: xxx_語言代碼_國家代碼 我們這裡 用到了 中英文名稱為: RetrievingRequestXMLError=Error retrieving requestXML from HTTP POST ...
  • #include <iostream>#include <algorithm>#include <map> using namespace std; int main() { int n, i, *arr1, *arr2; map<int, int> match; while(cin>>n) { a ...
  • Java容器可以說是增強程式員編程能力的基本工具,本系列將帶您深入理解容器類。 容器的用途 如果對象的數量與生命周期都是固定的,自然我們也就不需要很複雜的數據結構。 我們可以通過創建引用來持有對象,如 也可以通過數組來持有多個對象,如 然而,一般情況下,我們並不知道要創建多少對象,或者以何種方式創建 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...