Java pdf下載最佳化:Java圖片壓縮

之前文章中寫過專案中實現pdf下載的需求(文章詳見),開發、測試、以及驗收的時候均沒有問題,前段時間業務方說下載pdf的功能總是報超時錯誤,排查了下原因,原來是pdf中放的圖片都是8M左右的,這肯定扛不住啊。問題發現了那就解決。思路有兩個:

壓縮圖片

非同步下載

1。壓縮圖片

這裡使用Google開源的

圖片壓縮庫thumbnailator

,這個工具簡單易用,支援各種壓縮方式,提供鏈式API,有興趣的可以去研究下。

專案引入依賴:

net。coobird thumbnailator 0。4。8

pfd渲染前,先把獲取到的圖片壓縮,虛擬碼如下(原始碼詳見):

Lists。partition(imageUrls, BULK_SIZE)。forEach(items -> { FraudReportOrderEvidenceImage image = new FraudReportOrderEvidenceImage(); for (int i = 0; i < items。size(); i++) { byte[] imageBytes = restTemplate。getForObject(items。get(i), byte[]。class); ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes); ByteArrayOutputStream baos = new ByteArrayOutputStream(BAOS_SIZE); try { //壓縮圖片 Thumbnails。of(bais)。scale(IMAGE_SCALE_SIZE)。toOutputStream(baos); byte[] thumbnailBytes = baos。toByteArray(); if (i == 0) { image。setReportDescImage(this。byte2String(thumbnailBytes)); continue; } if (i == 1) { image。setReportDescImage2(this。byte2String(thumbnailBytes)); continue; } if (i == 2) { image。setReportDescImage3(this。byte2String(thumbnailBytes)); continue; } if (i == 3) { image。setReportDescImage4(this。byte2String(thumbnailBytes)); } } catch (Exception e) { log。error(“壓縮圖片失敗”, e); throw new ServiceResponseException(“壓縮圖片失敗”); } } images。add(image); });log。info(“read {} images byte costs: {}ms”, imageUrls。size(), System。currentTimeMillis() - start);

經過thumbnailator壓縮之後,

圖片位元組大大縮小,同時圖片並沒有失真模糊

,在頁面點選下載按鈕,實時下載正常,不再超時

2。非同步下載

實際上,下載檔案在系統中一般都是非核心流程,所以大多數系統都是採用

非同步下載

的方式,所謂非同步下載是相對系統實時渲染資料給到前端供使用者下載而言的,實現方式就是系統在業務低峰期(比如凌晨2點)透過

job定時

去獲取指定的資料,

生成相應的檔案,然後上傳到file server或者OSS伺服器,上傳成功後,系統庫表中保留檔案資源的地址

。下載頁面會把相應記錄對應的檔案地址返回給前端,使用者下載的時候,前端直接透過地址url去download指定的檔案即可,這樣下載的處理就從業務系統中剝離出去,不會因為大檔案的耗時處理影響業務系統性能。一般批處理系統、數倉、BI等都是以這種方式生成檔案,供客戶端下載。需要說明的是,此種方式下載,資料一般是T+1的,但由於是非核心功能,所以T+1是完全沒問題的。

ps:

每張圖片8M左右,壓縮之後正常下載

Java pdf下載最佳化:Java圖片壓縮

圖片合理壓縮後的pdf效果