Java簡單生成pdf

生成這樣的PDF

?

直接上代碼

    public static void main(String[] args) {String logoPath = "Q:\\IdeaWork\\Demo\\src\\main\\webapp\\images\\logo.jpg"; // 替換為實際路徑String baseDir = "E:/Demo/TEST/problem/Generate"; // 基礎目錄int year = 2025; // 動態年份String issueId = "100002"; // 動態問題ID// 生成完整路徑(自動處理斜杠)String outputDir = Paths.get(baseDir, String.valueOf(year), issueId).toString();String outputFilePath = Paths.get(outputDir, "重大事件通報.pdf").toString();try {// 確保目錄存在,不存在則創建Path dirPath = Paths.get(outputDir);if (!Files.exists(dirPath)) {Files.createDirectories(dirPath);System.out.println("目錄創建成功: " + dirPath);}// 生成PDFgeneratePdf(logoPath, outputFilePath);System.out.println("PDF生成成功: " + outputFilePath);} catch (Exception e) {e.printStackTrace();}}
public static void generatePdf(String logoPath, String outputPath)throws DocumentException, IOException {// 其余代碼保持不變(和之前一樣)Document document = new Document(PageSize.A4, 50, 50, 50, 50);PdfWriter.getInstance(document, new FileOutputStream(outputPath));document.open();// 設置中文字體BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font titleFont = new Font(bfChinese, 16, Font.BOLD);Font headerFont = new Font(bfChinese, 12, Font.BOLD);Font normalFont = new Font(bfChinese, 10, Font.NORMAL);Font underlineFont = new Font(bfChinese, 16, Font.BOLD);//underlineFont.setStyle(Font.UNDERLINE);// 添加logotry {Image logo = Image.getInstance(logoPath);logo.scaleToFit(80f, 40f); // 調整logo大小logo.setAlignment(Element.ALIGN_CENTER);document.add(logo);} catch (Exception e) {System.out.println("無法加載logo圖片: " + e.getMessage());}// 添加標題Paragraph title = new Paragraph("重 大 事 件 通 報", underlineFont);title.setAlignment(Element.ALIGN_CENTER);title.setSpacingAfter(20f);document.add(title);// 添加基本信息表格// 創建表格(2列)PdfPTable infoTable = new PdfPTable(2);infoTable.setWidthPercentage(80); // 縮小表格總寬度infoTable.setHorizontalAlignment(Element.ALIGN_LEFT); // 整體左對齊// 設置列寬(左邊固定30mm,右邊自適應)infoTable.setWidths(new float[]{30, 70}); // 單位:毫米// 添加表格內容(":"后加空格)addTableCell(infoTable, "操作:", "王峰", headerFont, normalFont);addTableCell(infoTable, "職位:", "考核師", headerFont, normalFont);addTableCell(infoTable, "被通報單位名稱:", "XXX公司", headerFont, normalFont);addTableCell(infoTable, "日期:", "2025年03月07日", headerFont, normalFont);document.add(infoTable);// 添加稱呼Paragraph greeting = new Paragraph("尊敬的XXX合作伙伴:", normalFont);greeting.setSpacingAfter(10f);document.add(greeting);Paragraph content = new Paragraph("為確保雙方合作的順利進行,現就以下關鍵事項進行通知,請您知悉并按要求執行。", normalFont);content.setSpacingAfter(20f);document.add(content);// 添加事件主題Paragraph eventTitle = new Paragraph("事件主題", headerFont);eventTitle.setSpacingAfter(5f);document.add(eventTitle);Paragraph eventContent = new Paragraph("交付異常", normalFont);eventContent.setSpacingAfter(15f);document.add(eventContent);// 添加事件說明Paragraph descriptionTitle = new Paragraph("事件說明", headerFont);descriptionTitle.setSpacingAfter(5f);document.add(descriptionTitle);Paragraph descriptionContent = new Paragraph("12月收貨異常,記錄一次性開箱不良關鍵事件", normalFont);descriptionContent.setSpacingAfter(15f);document.add(descriptionContent);// 添加關鍵得分Paragraph scoreTitle = new Paragraph("關鍵得分", headerFont);scoreTitle.setSpacingAfter(5f);document.add(scoreTitle);Paragraph scoreContent = new Paragraph("-3分", normalFont);scoreContent.setSpacingAfter(15f);document.add(scoreContent);// 添加關鍵要求Paragraph requirementTitle = new Paragraph("關鍵要求", headerFont);requirementTitle.setSpacingAfter(5f);document.add(requirementTitle);Paragraph requirementContent = new Paragraph("請供應商按我司關鍵事件通報,提交整改方案及相關文件材料", normalFont);requirementContent.setSpacingAfter(15f);document.add(requirementContent);// 添加截止時間Paragraph deadlineTitle = new Paragraph("截止時間", headerFont);deadlineTitle.setSpacingAfter(5f);document.add(deadlineTitle);Paragraph deadlineContent = new Paragraph("請于2025年03月15日前組織整改回復,謝謝", normalFont);deadlineContent.setSpacingAfter(20f);document.add(deadlineContent);// 添加聯系方式Paragraph contactTitle = new Paragraph("六、聯系方式", headerFont);contactTitle.setSpacingAfter(5f);document.add(contactTitle);Paragraph contactContent = new Paragraph();contactContent.add(new Chunk("聯系人:", headerFont));contactContent.add(new Chunk("123456 王峰 (創建人)", normalFont));contactContent.add(Chunk.NEWLINE);contactContent.add(new Chunk("郵箱:", headerFont));contactContent.add(new Chunk("chenxiaogang@xxx.com", normalFont));contactContent.add(Chunk.NEWLINE);contactContent.add(new Chunk("發通報公司:", headerFont));contactContent.add(new Chunk("具體梓公司", normalFont));contactContent.setSpacingAfter(20f);document.add(contactContent);// 添加結尾Paragraph ending = new Paragraph("感謝您的配合與支持,期待我們繼續攜手共進,實現互利共贏!此致,敬禮!", normalFont);ending.setSpacingAfter(10f);document.add(ending);Paragraph company = new Paragraph("********有限公司", normalFont);company.setAlignment(Element.ALIGN_RIGHT);company.setSpacingAfter(5f);document.add(company);Paragraph date = new Paragraph("日期:2025年03月07日", normalFont);date.setAlignment(Element.ALIGN_RIGHT);document.add(date);// 關閉文檔document.close();}
    private static void addTableCell(PdfPTable table, String header, String content,Font headerFont, Font contentFont) {// 左邊單元格(標簽)PdfPCell headerCell = new PdfPCell(new Phrase(header + " ", headerFont));headerCell.setBorder(Rectangle.NO_BORDER);headerCell.setPaddingRight(5f); // 標簽右側內邊距table.addCell(headerCell);// 右邊單元格(內容)PdfPCell contentCell = new PdfPCell(new Phrase(content, contentFont));contentCell.setBorder(Rectangle.NO_BORDER);contentCell.setHorizontalAlignment(Element.ALIGN_LEFT); // 內容左對齊contentCell.setPaddingRight(15f); // 內容右側內邊距table.addCell(contentCell);}

注意事項:

  1. 您需要將logoPath變量替換為實際的logo圖片路徑,確保圖片存在且可訪問。

  2. 此代碼使用了iText庫,您需要在項目中添加以下依賴:

  3. <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version>
    </dependency>

  4. 代碼中使用了中文字體"STSong-Light",這是iText自帶的中文字體。如果您需要其他字體,可以指定其他支持中文的字體文件路徑。

  5. 生成的PDF文件將保存在outputPath指定的路徑。

  6. 如果您在Servlet環境中使用此代碼,可以將logoPath設置為:

  7. String logoPath = session.getServletContext().getRealPath("/") + "/images/envicool.jpg";

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

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

相關文章

k8s存儲介紹(六)StorangeClass

一、Kubernetes 存儲類&#xff08;StorageClass&#xff09;詳解 1. 什么是 StorageClass&#xff1f; 在 Kubernetes 中&#xff0c;StorageClass&#xff08;存儲類&#xff09;是一種用于動態創建 PersistentVolume&#xff08;PV&#xff09;的資源對象。它允許管理員根…

C++:allocator類(動態數組續)

1.為什么需要 allocator&#xff1f; 在 C 中&#xff0c;動態內存管理通常通過 new 和 delete 完成&#xff1a; int* p new int; // 分配內存 構造對象 delete p; // 析構對象 釋放內存 但 new 和 delete 有兩個問題&#xff1a; 耦合性&#xff1a;將內…

北斗導航 | 中國北斗衛星導航系統的發展歷程——“三步走”戰略:背景,信號頻點,調制方式,短報文,等

中國北斗衛星導航系統的發展歷程按照“三步走”戰略逐步推進,從區域服務到全球覆蓋,形成了北斗一號、北斗二號、北斗三號三代系統的迭代升級,展現了中國航天科技的自主創新與突破。以下是各階段的核心內容與發展特點綜述:一、北斗一號:中國衛星導航的奠基(1994-2003年) …

Headless Chrome 優化:減少內存占用與提速技巧

在當今數據驅動的時代&#xff0c;爬蟲技術在各行各業扮演著重要角色。傳統的爬蟲方法往往因為界面渲染和資源消耗過高而無法滿足大規模數據采集的需求。本文將深度剖析 Headless Chrome 的優化方案&#xff0c;重點探討如何利用代理 IP、Cookie 和 User-Agent 設置實現內存占用…

英偉達GB300新寵:新型LPDDR5X SOCAMM內存

隨著人工智能&#xff08;AI&#xff09;、機器學習&#xff08;ML&#xff09;和高性能計算&#xff08;HPC&#xff09;應用的快速發展&#xff0c;對于高效能、大容量且低延遲內存的需求日益增長。NVIDIA在其GB系列GPU中引入了不同的內存模塊設計&#xff0c;以滿足這些嚴格…

靜態網頁應用開發環境搭建實戰教程

1. 前言 靜態網頁開發是前端工程師的基礎技能之一&#xff0c;無論是個人博客、企業官網還是簡單的Web應用&#xff0c;都離不開HTML、CSS和JavaScript。搭建一個高效的開發環境&#xff0c;能夠極大提升開發效率&#xff0c;減少重復工作&#xff0c;并優化調試體驗。 本教程…

Python每日一題(9)

Python每日一題 2025.3.29 一、題目二、分析三、源代碼四、deepseek答案五、源代碼與ai分析 一、題目 question["""企業發放的獎金根據利潤提成。利潤(I)低于或等于10萬元時,獎金可提10%,利潤高于10萬元,低于20萬元時,低于10萬元的部分按10%提成,高于10萬元的部…

游戲引擎學習第187天

看起來觀眾解決了上次的bug 昨天遇到了一個相對困難的bug&#xff0c;可以說它相當棘手。剛開始的時候&#xff0c;沒有立刻想到什么合適的解決辦法&#xff0c;所以今天得從頭開始&#xff0c;逐步驗證之前的假設&#xff0c;收集足夠的信息&#xff0c;逐一排查可能的原因&a…

【入門初級篇】布局類組件的使用(1)

【入門初級篇】布局類組件的使用&#xff08;1&#xff09; 視頻要點 &#xff08;1&#xff09;章節大綱介紹 &#xff08;2&#xff09;布局類組件類型介紹&#xff1a;行布局、列布局、標題 &#xff08;3&#xff09;實操演示&#xff1a;列表統計查詢布局模型 點擊訪問my…

對內核fork進程中寫時復制的理解記錄

前言 文章寫于學習Redis時對aof后臺重寫中寫時復制的疑問 一、感到不理解的歧義 在部分技術文檔中&#xff08;以小林的文章為例&#xff09;&#xff0c;對寫時復制后的內存權限存在如歧義&#xff1a; ! 二、正確技術表述 根據Linux內核實現&#xff08;5.15版本&#x…

Ditto-Talkinghead:阿里巴巴數字人技術新突破 [特殊字符]?

Ditto-Talkinghead&#xff1a;阿里巴巴數字人技術新突破 &#x1f5e3;? 阿里巴巴推出了一項新的數字人技術&#xff0c;名為 Ditto-Talkinghead。這項技術主要用于生成由音頻驅動的說話頭&#xff0c;也就是我們常說的“數字人”。不過&#xff0c;現有的基于擴散模型的同類…

.NET開發基礎知識1-10

1. 依賴注入&#xff08;Dependency Injection&#xff09; 技術知識&#xff1a;依賴注入是一種設計模式&#xff0c;它允許將對象的依賴關系從對象本身中分離出來&#xff0c;通過構造函數、屬性或方法參數等方式注入到對象中。這樣可以提高代碼的可測試性、可維護性和可擴展…

每日一題 MySQL基礎知識----(三)

數據庫常用基礎知識&#xff1a;代碼講解和實驗 1.創建數據庫student 02&#xff0c;創建一個名為student02的數據庫 CREATE DATABASE student02; 2.在student02中創建一張 students表&#xff0c;并且具有學生的編號id&#xff0c;姓名name&#xff0c;年齡age&#xff0c;生…

MySQL多表查詢實驗

1.數據準備 -- 以下語句用于創建 students 表&#xff0c;該表存儲學生的基本信息 -- 定義表名為 students CREATE TABLE students (-- 定義學生的唯一標識符&#xff0c;類型為整數&#xff0c;作為主鍵&#xff0c;且支持自動遞增student_id INT PRIMARY KEY AUTO_INCREMENT…

windows第二十章 單文檔應用程序

文章目錄 單文檔定義新建一個單文檔應用程序單文檔應用程序組成&#xff1a;APP應用程序類框架類&#xff08;窗口類&#xff09;視圖類&#xff08;窗口類&#xff0c;屬于框架的子窗口&#xff09;文檔類&#xff08;對數據進行保存讀取操作&#xff09; 直接用向導創建單文檔…

C++ 初階總復習 (16~30)

C 初階總復習 &#xff08;16~30&#xff09; 目的16. 2009. volatile關鍵字的作用17. 2010.什么是多態 簡單介紹下C的多態18. 2011. 什么是虛函數 介紹下C中虛函數的原理19. 2012 構造函數可以是虛函數嘛20. 2013.析構函數一定要是虛函數嘛&#xff1f;21. 2015. 什么是C中的虛…

第一天 Linux驅動程序簡介

目錄 一、驅動的作用 二、裸機驅動 VS linux驅動 1、裸機驅動 2、linux驅動 三、linux驅動位于哪里&#xff1f; 四、應用編程 VS 內核編程 1、共同點 2、不同點 五、linux驅動分類 1、字符設備 2、塊設備 3、網絡設備 六、Linux驅動學習難點與誤區 1、學習難點 …

PaddleX產線集成功能的使用整理

一、環境搭建 1.1 安裝paddle-gpu 需要根據安裝機器的cuda的版本&#xff0c;選擇合適的版本進行安裝 #安裝paddle-gpu 官網鏈接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

docker-compese 啟動mysql8.0.36與phpmyadmin,并使用web連接數據庫

1、找一個文件夾&#xff0c;比如 E:\zqy\file\mysql&#xff0c;cd到這個目錄下創建文件docker-compose.yml 2、將下面的代碼塊復制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

解決 Gradle 構建錯誤:Could not get unknown property ‘withoutJclOverSlf4J’

解決 Gradle 構建錯誤&#xff1a;Could not get unknown property ‘withoutJclOverSlf4J’ 在構建 Spring 源碼或其他基于 Gradle 的項目時&#xff0c;可能會遇到如下錯誤&#xff1a; Could not get unknown property withoutJclOverSlf4J for object of type org.gradle…