java 根據前端傳回的png圖片數組,后端加水印加密碼生成pdf,返回給前端

前端傳回的png圖片數組,后端加水印加密碼生成pdf,返回給前端

    • 場景:
    • 重點:
    • maven依賴
    • controller
    • service

場景:

當前需求,前端通過html2canvas將頁面報表生成圖片下載,可以仍然不滿意。
需要java后端將前端傳過來的圖片生成pdf,并且加密碼加水印。

重點:

pdf使用A4大小,但是要考慮。根據A4寬高縮放圖片后,圖片仍然大于A4長度,此時要對圖片進行裁剪(2頁,3頁…)

maven依賴

<!-- pdf文件水印添加 -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.4</version><type>pom</type>
</dependency>

controller

    @PostMapping("/addMarkAndPasswordPdf")@ApiOperation(value = "文件處理-增加水印及密碼--入參為文件", notes = "")public void addMarkAndPasswordPdf(@RequestParam("fileStream") MultipartFile[] fileStreams,@RequestParam("filePdfName")String filePdfName,  HttpServletRequest request, HttpServletResponse response) {Calendar calendar = Calendar.getInstance();String date = calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1);SysUserEntity uc = (SysUserEntity) request.getAttribute("UC");SysUserEntity uc1 = userService.getUserByCode(uc.getUserCode());fileProcessService.fileProcessPdf(fileStreams,filePdfName,uc1,response);}

service

  @Overridepublic void fileProcessPdf(MultipartFile[] imageFiles,String filePdfName, SysUserEntity uc, HttpServletResponse response) {response.setHeader("Content-disposition", "attachment;filename=" + filePdfName);// 直接用瀏覽器或者用postmanresponse.setContentType("application/pdf");response.setCharacterEncoding("utf-8");try {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 創建PDF文檔 加密PDF文檔PdfWriter writer = new PdfWriter(byteArrayOutputStream,new WriterProperties().setStandardEncryption(// 用戶密碼uc.getPassword().getBytes(),// 所有者密碼uc.getPassword().getBytes(),// 允許的權限EncryptionConstants.ALLOW_PRINTING | EncryptionConstants.ALLOW_COPY,// 加密標準EncryptionConstants.STANDARD_ENCRYPTION_128));PdfDocument pdfDoc = new PdfDocument(writer);Document document = new Document(pdfDoc);// 讀取原始圖片.按照A4拆分圖片,放到pdffor(MultipartFile imageFile: imageFiles){BufferedImage originalImage = ImageIO.read(imageFile.getInputStream());float maxHeight =  (PageSize.A4.getHeight()/PageSize.A4.getWidth())*originalImage.getWidth();ArrayList<BufferedImage> cropImageList = cropImageByMaxHeight(originalImage, (int) maxHeight);for (BufferedImage bufferedImage : cropImageList) {// 添加圖片PdfPage page = pdfDoc.addNewPage();ByteArrayOutputStream ImageOutputStream = new ByteArrayOutputStream();ImageIO.write(bufferedImage, "png", ImageOutputStream);ImageData imageData = ImageDataFactory.create(ImageOutputStream.toByteArray());com.itextpdf.layout.element.Image image = new com.itextpdf.layout.element.Image(imageData);image.setHorizontalAlignment(HorizontalAlignment.CENTER);document.add(image);ImageOutputStream.close();// 循環為頁設置水印setPageWatermark(page, pdfDoc,uc.getCname() + ", " + uc.getDeptTwo(),140);}}// 關閉文檔以不再寫入內容document.close();pdfDoc.close();writer.close();// 將PDF寫入響應輸出流response.getOutputStream().write(byteArrayOutputStream.toByteArray());response.getOutputStream().flush();byteArrayOutputStream.close();} catch (Exception e) {e.printStackTrace();log.error(e.getMessage());}}/**** 為PDF頁繪畫水印* @param pdfPage PDF頁對象* @param msg 水印信息* @param interval 水印間隔* @throws IOException 這里的異常是無法獲取字體異常*/public static void setPageWatermark(PdfPage pdfPage,PdfDocument pdfDoc, String msg, int interval) throws IOException {// 通過PDF頁來構建畫布PdfCanvas pdfCanvas = new PdfCanvas(pdfPage);// 中文顯示字體
//        PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H");float width = pdfPage.getPageSize().getWidth();float height = pdfPage.getPageSize().getHeight();// 開始繪畫水印for (int x = 0; x < pdfPage.getPageSize().getWidth(); x += interval) {for (int y = 0; y < pdfPage.getPageSize().getHeight(); y += interval) {Canvas canvas = new Canvas(pdfCanvas, pdfDoc, new Rectangle(0, 0, width, height))// 顏色和透明度.setFontColor(ColorConstants.GRAY, .2f)// 文字樣式
//                        .setFont(font)// 字體大小(具體可以改).setFontSize(20).showTextAligned(msg, x, y, TextAlignment.CENTER,VerticalAlignment.MIDDLE, 19.5f);canvas.close();}}// 釋放畫布。使用完畫布后,請使用此方法。pdfCanvas.release();}/*** 將圖片進行裁剪** @param originalImage* @param maxHeight* @return*/public static ArrayList<BufferedImage> cropImageByMaxHeight(BufferedImage originalImage, int maxHeight) {ArrayList<BufferedImage> croppedImages = new ArrayList<>();int originalHeight = originalImage.getHeight();int numImages = originalHeight / maxHeight;int remainder = originalHeight % maxHeight;for (int i = 0; i < numImages; i++) {int y = i * maxHeight;BufferedImage croppedImage = originalImage.getSubimage(0, y, originalImage.getWidth(), maxHeight);croppedImages.add(croppedImage);}// 處理剩余高度(如有)if (remainder > 0) {int y = numImages * maxHeight;BufferedImage croppedImage = originalImage.getSubimage(0, y, originalImage.getWidth(), remainder);croppedImages.add(croppedImage);}return croppedImages;}

成果:

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

數據分庫分表和遷移方案

在我們業務快速發展的過程中&#xff0c;數據量必然也會迎來突飛猛漲。那么當我們的數據量百倍、千倍、萬倍、億倍增長后&#xff0c;原有的單表性能就不能滿足我們日常的查詢和寫入了&#xff0c;此時數據架構就不得不進行拆分&#xff0c;比如單表拆分成10張表、100張表、單個…

線上突發:MySQL 自增 ID 用完,怎么辦?

線上突發&#xff1a;MySQL 自增 ID 用完&#xff0c;怎么辦&#xff1f; 1. 問題背景2. 場景復現3. 自增id用完怎么辦&#xff1f;4. 總結 1. 問題背景 最近&#xff0c;我們在數據庫巡檢的時候發現了一個問題&#xff1a;線上的地址表自增主鍵用的是int類型。隨著業務越做越…

[Java] Solon 框架的三大核心組件之一插件擴展體系

1、Solon 的三大核心組件 核心組件說明Plugin 插件擴展機制提供“編碼風格”的擴展體系Ioc/Aop 應用容器提供基于注入依賴的自動裝配體系ContextHandler 通用上下文處理接口提供“開放式處理”適配體系&#xff08;俗稱&#xff0c;三元合一&#xff09; 2、Solon Plugin 插件…

TRELLIS微軟的圖生3D

TRELLIS 教程目錄&#xff1a; Youtube&#xff1a;https://www.youtube.com/watch?vJqFHZ-dRMhI 官網地址&#xff1a;https://trellis3d.github.io/ GitHub&#xff1a;https://github.com/Microsoft/TRELLIS 部署目錄&#xff1a; 克隆項目 git clone --recurse-submodul…

Java導出通過Word模板導出docx文件并通過QQ郵箱發送

一、創建Word模板 {{company}}{{Date}}服務器運行情況報告一、服務器&#xff1a;總告警次數&#xff1a;{{ServerTotal}} 服務器IP:{{IPA}}&#xff0c;總共告警次數:{{ServerATotal}} 服務器IP:{{IPB}}&#xff0c;總共告警次數:{{ServerBTotal}} 服務器IP:{{IPC}}&#x…

【22】Word:小李-高新技術企業政策?

目錄 題目? NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在刪除空白行等要求&#xff0c;可以到最后來完成。注意最后一定要檢查此部分&#xff01;注意&#xff1a;大多是和事例一樣即可&#xff0c;不用一摸一樣&#xff0c;但也不要差太多。 題目 NO1.2 F12Fn&a…

自動化部署(三):項目管理平臺

一、項目管理平臺作用 幫助團隊高效規劃、執行和監控項目進度&#xff0c;確保任務按時完成并實現目標 敏捷開發&#xff1a;提供標準敏捷研發管理&#xff0c;支持Scrum 與 Kanban 規模化敏捷&#xff1a;支持大型研發團隊跨項目協同&#xff0c;實現多項目路線圖規劃和資源管…

常用集合-數據結構-MySql

目錄 java核心&#xff1a; 常用集合與數據結構: 單例集合: 雙列集合: 線程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue隊列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

IP屬地與視頻定位位置不一致:現象解析與影響探討

在數字化時代&#xff0c;IP屬地和視頻定位位置已成為我們獲取網絡信息、判斷內容真實性的重要依據。然而&#xff0c;有時我們會發現&#xff0c;某些視頻內容中展示的定位位置與其發布者的IP屬地并不一致。這種不一致現象引發了廣泛的關注和討論。本文旨在深入剖析IP屬地與視…

計算機畢業設計hadoop+spark股票基金推薦系統 股票基金預測系統 股票基金可視化系統 股票基金數據分析 股票基金大數據 股票基金爬蟲

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

機器學習-數據集劃分

文章目錄 一. 為什么要劃分數據集二. 數據集劃分的方法1. 留出法&#xff1a;2. 交叉驗證&#xff1a;將數據集劃分為訓練集&#xff0c;驗證集&#xff0c;測試集3. 留一法&#xff1a;4. 自助法&#xff1a; 一. 為什么要劃分數據集 為了能夠評估模型的泛化能力&#xff0c;可…

根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的Spotify音樂 附python代碼

這段代碼是一個Python腳本,它使用了幾個外部庫來創建一個簡單的圖形用戶界面(GUI),讓用戶根據當前用戶的活動、當地天氣和喜歡音樂類型,然后根據這些信息來播放相應的音樂。 1. **導入庫**: - `openai`:用于與OpenAI API交互(盡管在這段代碼中沒有使用)。 - `sp…

excel導入數據處理前端

dialogErrorVisible false;dialogErrorTitle ;//錯誤標題public get gridErrorOptions(): GridOptions {return {headerHeight: 30, // 表頭高度rowHeight: 30, // 行高columnDefs: [//列定義{headerName: "序號",field: "SerialNumber",width: 40,pinne…

Vue 攔截監聽原理

Vue 漸進式JavaScript 框架 學習筆記 - Vue 攔截監聽原理 目錄 攔截監聽原理 如何跟蹤變化 攔截監聽示例 觀察者 注意:vue3的變化 總結 攔截監聽原理 如何跟蹤變化 當你把一個普通的Javascript 對象傳入 Vue 實例作為data選項&#xff0c;Vue 將遍歷此對象所有的proper…

全面評測 DOCA 開發環境下的 DPU:性能表現、機器學習與金融高頻交易下的計算能力分析

本文介紹了我在 DOCA 開發環境下對 DPU 進行測評和計算能力測試的一些真實體驗和記錄。在測評過程中&#xff0c;我主要關注了 DPU 在高并發數據傳輸和深度學習場景下的表現&#xff0c;以及基本的系統性能指標&#xff0c;包括 CPU 計算、內存帶寬、多線程/多進程能力和 I/O 性…

基于JAVA的校園二手商品交易平臺的設計與開發

摘 要&#xff1a;政府政策引導與社會觀念的轉變使得國內大學生的創業意識逐漸提高&#xff0c;很多高校大學生開始自主創業。目前我國各大高校暫且還沒有較為成型的針對校內學生創業者的校園網絡服務平臺。本文首先主要是介紹了關于java語言以及web開發的相關技術&#xff0c;…

HarmonyOS Next 應用UI生成工具介紹

背景 HarmonyOS Next適配開發過程中難買難要參考之前邏輯&#xff0c;但是可能時間較長文檔不全&#xff0c;只能參考Android或iOS代碼&#xff0c;有些邏輯較重的場景還可以通過AI工具將Android 的Java代碼邏輯轉成TS完成部分復用。對于一些UI場景只能手動去寫&#xff0c;雖…

總結6..

背包問題的解決過程 在解決問題之前&#xff0c;為描述方便&#xff0c;首先定義一些變量&#xff1a;Vi表示第 i 個物品的價值&#xff0c;Wi表示第 i 個物品的體積&#xff0c;定義V(i,j)&#xff1a;當前背包容量 j&#xff0c;前 i 個物品最佳組合對應的價值&#xff0c;同…

代碼隨想錄day1

704.二分查找&#xff1a; 1.左閉右閉 int search(vector<int>& nums, int target) {int right nums.size() - 1;int left 0;while(left < right){int middle left ((right - left) >> 1);if(nums.at(middle) target){return middle;}else if(nums[m…

四級詞匯第六期

1.accomplish 完成 2.implication 暗示 3.complicated 復雜的 4.extent 范圍 5.sufficient 充足的 6.remarkable 引人注目的 7.insight 洞察 8.executive 管理的 9.overlook 俯瞰 忽略 10.urge 渴望 激勵 11.urgent 緊急的 12.accumulate 積累 13.appreciate 賞識 …