Java生成PDF筆記整理

  1. 引入依賴, groupId:com.itextpdf, version:8.0.4, artifactId如下
    kernel,io,layout,forms
    
  2. 創建pdf對象
    try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){PdfWriter writer = new PdfWriter(outputStream, new WriterProperties().setFullCompressionMode(true));PdfDocument pdfDoc = new PdfDocument(writer);Document document = new Document(pdfDoc, PageSize.LETTER);document.setMargins(5, 15, 36, 15);// 添加內容 ...Table table = .... ; // 創建Table對象document.add(table);//document.close();return outputStream.toByteArray() ;
    }
    
  3. 在pdf每頁頂部固定位置添加頁眉
     int numberOfPages = pdfDoc.getNumberOfPages();LocalDate now = LocalDate.now();String dateContent = "Date : " + now.getYear()+ "/"+ now.getMonthValue() +"/"+ now.getDayOfMonth() ;Paragraph dateParagraph = new Paragraph(dateContent).setFontSize(7).setFontColor(ColorConstants.BLACK);for (int i = 1; i <= numberOfPages; i++) {String pageContent = "Page: "+ i +" of " + numberOfPages ;Paragraph pageParagraph = new Paragraph( pageContent).setFontSize(7).setFontColor(ColorConstants.BLACK);Rectangle pageSize = pdfDoc.getPage(i).getPageSize();float x = pageSize.getWidth() * 0.6f -2;float y = pageSize.getTop() - 12;doc.showTextAligned(pageParagraph, x, y, i, TextAlignment.LEFT, VerticalAlignment.BOTTOM, 0);doc.showTextAligned(dateParagraph, x + 70, y, i, TextAlignment.LEFT, VerticalAlignment.BOTTOM, 0);}
    
  4. 合并pdf
    // part1Bytes、part2Bytes 為兩個pdf文件的字節數組
    try(ByteArrayInputStream part1InputSteam = new ByteArrayInputStream(part1Bytes);ByteArrayInputStream part2InputStream = new ByteArrayInputStream(part2Bytes)){// Create PdfDocument object of each pdfPdfDocument part1Doc = new PdfDocument(new PdfReader(part1InputSteam));PdfDocument part2Doc = new PdfDocument(new PdfReader(part2InputStream));// merger.merge(part1Doc, 1, part1Doc.getNumberOfPages());merger.merge(part2Doc, 1, part2Doc.getNumberOfPages());// Source documents can be closed implicitly after merging,// by passing true to the setCloseSourceDocuments(boolean) methodpart1Doc.close();part2Doc.close();
    }
    

Table 創建及屬性配置

  1. 創建Table對象
    Cell cell = ... ; 
    // columnWidth 會使得表格的列寬度按照比例分配
    float[] columnWidth = {1, 2, 1};
    Table table = new Table(UnitValue.createPercentArray(columnWidth))table.addCell(cell);
    
  2. 表格填充整個寬度
    table.useAllAvailableWidth();
    // table.setWidth(UnitValue.createPercentValue(100)); // 也可以設置寬度 
    
  3. 創建普通文本Cell
    Cell cell = new Cell() ;
    // 填充單元格內容
    Paragraph paragraph = new Paragraph(content).setFontSize(7) ;
    cell.add(paragraph);
    
  4. 設置對其方式
      Cell cell = new Cell() ;cell.setTextAlignment(TextAlignment.CENTER) ;cell.setVerticalAlignment(VerticalAlignment.MIDDLE)cell.setHorizontalAlignment(HorizontalAlignment.CENTER) ;
    
  5. 創建圖片Cell
    ClassPathResource resource = new ClassPathResource("banner.jpg");
    byte[] bannerData = resource.getContentAsByteArray();
    ImageData imageData = ImageDataFactory.create(bannerData);
    Image banner = new Image(imageData);
    // 設置圖片寬度
    banner.setWidth(80) ;
    Cell cell = new Cell().add(banner);
    
  6. 合并單元格
    table.addCell(new Cell(1, 3).add(new Paragraph("Cell with colspan 3")));
    table.addCell(new Cell(2, 1).add(new Paragraph("Cell with rowspan 2")));
    
  7. 去除表格邊框
    // 這個設置不生效 table.setBorder(Border.NO_BORDER);
    Cell cell = new Cell() ;
    // ...
    cell.setBorder(Border.NO_BORDER) ;
    

Div 使用

  1. 創建Div對象
     Paragraph divHeader = new Paragraph("Hello : 1" ).setFontSize(7).setMargins(0,0,0,0).setPaddings(0,0,0,0);Paragraph divText = new Paragraph("World : 2").setFontSize(7).setMargins(0,0,0,0).setPaddings(0,0,0,0);Div div = new Div().add(divHeader).add(divText).setWidth(160).setPaddings(8, 0, 0, 0).setHorizontalAlignment(HorizontalAlignment.LEFT) ;
    

IEventHandler 使用(符合event事件的時候在pdf中插入內容)

  1. 繼承IEventHandler 接口, 實現handleEvent 方法
    public abstract class HelloHeaderEventHandler implements IEventHandler {private final Document doc;private final Table header;private final float tableHeight;protected HelloHeaderEventHandler(Document doc, Table header){this.doc = doc ;this.header = header ;this.tableHeight = this.calTableHeight(header) ;}@Overridepublic void handleEvent(Event currentEvent) {PdfDocumentEvent docEvent = (PdfDocumentEvent) currentEvent;PdfDocument pdfDoc = docEvent.getDocument();PdfPage page = docEvent.getPage();PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);PageSize pageSize = pdfDoc.getDefaultPageSize();float coordX = pageSize.getX() + doc.getLeftMargin();float coordY = pageSize.getTop() - doc.getTopMargin();float width = pageSize.getWidth() - doc.getRightMargin() - doc.getLeftMargin();float height = getHeaderHeight();Rectangle rect = new Rectangle(coordX, coordY, width, height);this.doHandleEvent(canvas, rect);}private void doHandleEvent(PdfCanvas canvas, Rectangle rect) {new Canvas(canvas, rect).add(header).close();}private float getHeaderHeight() {return tableHeight;}private float calTableHeight(Table table){TableRenderer renderer = (TableRenderer) table.createRendererSubTree();renderer.setParent(new DocumentRenderer(doc));// Simulate the positioning of the renderer to find out how much space the header table will occupy.LayoutResult result = renderer.layout(new LayoutContext(new LayoutArea(0, PageSize.A4)));return result.getOccupiedArea().getBBox().getHeight();}
    }
    
  2. PdfDocument 對象添加事件
    PdfWriter writer = new PdfWriter(outputStream, new WriterProperties().setFullCompressionMode(true));
    PdfDocument pdfDoc = new PdfDocument(writer);
    Document document = new Document(pdfDoc, PageSize.LETTER);
    // 
    Table header = ...; // 創建Table對象
    IEventHandler eventHandler = new HelloHeaderEventHandler(document, header)
    pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, eventHandler);
    // 設置頁面邊距
    float topMargin = 3 + eventHandler.getHeaderHeight();
    document.setMargins(topMargin, 15, 36, 15);
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20830.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20830.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20830.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

離線安裝python庫

1. 下載安裝包 在聯網機器上安裝 # 選擇符合目標架構的版本&#xff0c;主要是libc版本和python版本 pip download --platformmanylinux2010_x86_64 --only-binary:all: --python-version3.7.4 tabulate # 或者 pip download --platformmanylinux_2_5_x86_64 --only-binary:a…

do...while循環

基本語法 while循環&#xff0c;是先判斷條件再執行。 do...while循環&#xff0c;是先斬后奏&#xff0c;先至少執行一次循環語句塊中的邏輯&#xff0c;再判斷是否繼續。 do {//do while 循環語句塊; } while (bool類型的值);注意&#xff1a;do...while語句&#xff0c;存…

Common Lisp筆記

在計劃學習函數式編程的時候&#xff0c;我一開始打算學習的是 F#。因為我朋友就是在 DTU 上的學&#xff0c;F# 就是 DTU&#xff08;丹麥理工&#xff09;開發的。但是由于 F# 和微軟的 .NET 綁定&#xff0c;而在 macOS 上&#xff0c;目前版本的 .NET 的是有些問題的&#…

2020編程語言排序:探索編程界的熱門與趨勢

2020編程語言排序&#xff1a;探索編程界的熱門與趨勢 在數字時代的浪潮中&#xff0c;編程語言作為構建數字世界的基石&#xff0c;其流行度和影響力不容忽視。2020年&#xff0c;各大編程語言在各自的領域里展現出獨特的魅力和實力。本文將從四個方面、五個方面、六個方面和…

線性代數|機器學習-P3乘法和因式分解矩陣

文章目錄 1. 矩陣分解2. S Q Λ Q T SQ\Lambda Q^T SQΛQT3. A U Σ V T AU\Sigma V^T AUΣVT4. A LU 分解5. 矩陣的四個子空間 1. 矩陣分解 目前我們有很多重要的矩陣分解&#xff0c;每個分解對應于多個前提條件&#xff0c;分解方法&#xff0c;分解后的形狀會中如下&…

【Vue】v-for中的key

文章目錄 一、引入問題二、分析問題 一、引入問題 語法&#xff1a; key屬性 "唯一值" 作用&#xff1a;給列表項添加的唯一標識。便于Vue進行列表項的正確排序復用。 為什么加key&#xff1a;Vue 的默認行為會嘗試原地修改元素&#xff08;就地復用&#xff09;…

馬寶國和沈有容-UMLChina建模知識競賽第5賽季第12輪

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 參考潘加宇在《軟件方法》和UMLChina公眾號文章中發表的內容作答。在本文下留言回答。 只要最先答對前3題&#xff0c;即可獲得本輪優勝。 如果有第4題&#xff0c;第4題為附加題&am…

大模型備案語料來源安全要求

大模型備案的語料來源安全要求&#xff0c;對服務提供者的要求如下。 a&#xff09;語料來源管理方面&#xff1a; 1&#xff09;面向特定語料來源進行采集前&#xff0c;應對該來源語料進行安全評估&#xff0c;語料內容中含違法不良信息超過5%的&#xff0c;不應采集該來源…

R語言ggplot2包繪制網絡地圖

重要提示&#xff1a;數據和代碼獲取&#xff1a;請查看主頁個人信息&#xff01;&#xff01;&#xff01; 載入R包 rm(listls()) pacman::p_load(tidyverse,assertthat,igraph,purrr,ggraph,ggmap) 網絡節點和邊數據 nodes <- read.csv(nodes.csv, row.names 1) edges…

【Python技術】AI編程新手快速入門學習LangChain大模型框架

如果我們要搞AI智能體&#xff0c;普通人一般 借助騰訊元器、 coze、KIMI 或者其他大平臺搞一搞&#xff0c;比如我配置的coze智能體在微信公眾號聊天。 對于程序員來說&#xff0c;一言不合就喜歡搞代碼。 前面文章也介紹了不少關于AI知識庫問答&#xff0c;AIagent 不少開源…

利用AI技術革新學習筆記整理:邁向高效學習的新時代

利用AI技術革新學習筆記整理&#xff1a;邁向高效學習的新時代 在數字化時代&#xff0c;學習方式正在經歷一場革命。人工智能&#xff08;AI&#xff09;技術的融入&#xff0c;讓學習筆記的整理變得更加高效、智能。本文將探討如何利用AI整理學習筆記&#xff0c;以及這一技…

指紋采集技術

目錄 1.概述 1.1 捺印油墨采集 1.2 現場指紋提取 1.3 在線指紋采集 2. 指紋采集器的關鍵技術指標 2.1 采集面積 2.2 分辨率 2.3 圖像質量 2.4 耐用性 1.概述 最早的指紋采集技術是油墨法&#xff0c;至少已經有上百年的歷史。1990年代出現了活體指紋采集器&#xff0c…

數據庫(入門)

文章目錄 一、數據庫(DB) 二、數據庫管理系統&#xff08;DBMS&#xff09; 三、SQL&#xff08;結構化查詢語言&#xff09; 四、三者的關系 五、端口號&#xff08;port number&#xff09; 一、數據庫(DB) 定義&#xff1a;按照一定格式存儲數據的一些文件的組合。 簡單來…

常用的變量命名

當命名編碼中的變量時&#xff0c;清晰、簡潔和具有描述性的命名是非常重要的。以下是一些常用的變量名稱示例&#xff1a; 整數型變量&#xff1a; countindexnumtotalsizelength 浮點型變量&#xff1a; priceratetemperatureweightheightamount 字符串型變量&#xff1a; …

大數據測試/ETL開發,如何造測試數據

相信很多的小伙伴&#xff0c;有些是大數據測試崗位&#xff0c;有些是ETL開發&#xff0c;都面臨著如何要造數據的情況。 1&#xff0c;造數背景 【大數據測試崗位】&#xff0c;比較出名的就是寧波銀行&#xff0c;如果你在寧波銀行做大數據開發&#xff0c;對著需求開發完…

數學建模 —— 層次分析法(2)

目錄 一、層次分析法&#xff08;AHP&#xff09; 二、構造比較判斷矩陣 2.1 兩兩比較法 三、單準則下的排序及一致檢驗 3.1 單準則下的排序 3.2 一致性檢驗 四、層次總排序 4.1 層次總排序的步驟 4.2 總排序一致性檢驗 一、層次分析法&#xff08;AHP&#xff09; 方…

xdp、dpdk、rdma能在同一網卡上同時使用嗎?

文心一言 XDP、DPDK和RDMA是三種不同的技術&#xff0c;它們各自在Linux網絡性能優化中扮演了不同的角色。關于它們能否在同一網卡上同時使用&#xff0c;我們需要考慮以下幾個方面&#xff1a; XDP&#xff08;eXpress Data Path&#xff09;&#xff1a; XDP是Linux內核提供…

SVM算法-非線性分類背后技術詳解

引言 支持向量機&#xff08;SVM&#xff09;是一種強大的監督學習算法&#xff0c;廣泛應用于分類和回歸任務中。本文將詳細介紹SVM算法在非線性分類任務中的應用&#xff0c;并通過代碼示例來展示其背后的技術精髓。我們將分三大部分來展開&#xff0c;本部分將重點介紹SVM算…

銀行批量支付業務功能測試點詳細介紹

銀行批量支付業務是一種銀行業務處理方式&#xff0c;它允許銀行將多個支付交易合并為一個批次&#xff0c;然后一次性進行處理。這種方式通常用于處理大量、重復性高或定期發生的支付交易&#xff0c;如工資發放、定期賬單支付等。 主要作用&#xff1a; 提高效率&#xff1…

【C++面試50題】

以下是針對C程序員面試可能遇到的一些問題&#xff0c;涵蓋了從基礎語法、面向對象、STL、內存管理、模板、異常處理、并發編程等多個方面。 ### 基礎概念與語法 1. C與C的主要區別是什么&#xff1f; 2. 什么是構造函數和析構函數&#xff1f;它們何時被調用&#xff1f; 3. 什…