Java 根據模板生成 PDF 文件 以及 excel 文件

来源:https://www.cnblogs.com/depressiom/p/18393147
-Advertisement-
Play Games

模板PDF 的欄位 引入maven <!-- iText for generating PDF files --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5. ...


模板PDF 的欄位

模板

引入maven

        <!-- iText for generating PDF files -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.2</version>
        </dependency>

Java 代碼


import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.*;

/**
     * 根據pdf模板進行質檢報告生成 並上傳oss地址  生成二維碼在質檢報告右上角
     * @param recordDTO
     * @return 返回 oss url
     */
    private String getPdfFilePath(TagPrintingRecordVO recordDTO) {
        String fileName = "";
        PdfReader reader;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            reader = new PdfReader("pdf/template.pdf");
            bos = new ByteArrayOutputStream();
            PdfStamper stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            Map<String, String> map = new HashMap<>();
            map.put("productName", recordDTO.getProductName());
            map.put("weight", "");
            map.put("specification", recordDTO.getSpecification().toString());
            if(recordDTO.getType() == 1){ // 盤螺
                map.put("dingchi", "");
                map.put("deliveryType", "盤螺");
            }else{  // 螺紋
                map.put("dingchi", recordDTO.getDingchi().toString());
                map.put("deliveryType", "熱軋");
            }
            map.put("batchNumber", recordDTO.getBatchNumber());
            map.put("c", recordDTO.getC().toString());
            map.put("mn", recordDTO.getMn().toString());
            map.put("si", recordDTO.getSi().toString());
            map.put("p", recordDTO.getP().toString());
            map.put("s", recordDTO.getS().toString());
            map.put("ceq", recordDTO.getCeq().toString());
            map.put("yieldTop", recordDTO.getYieldTop());
            map.put("yieldDown", recordDTO.getYieldDown().toString());
            map.put("tensileTop", recordDTO.getTensileTop());
            map.put("tensileDown", recordDTO.getTensileDown().toString());
            map.put("yieldRatioTop", recordDTO.getYieldRatioTop());
            map.put("yieldRatioDown", recordDTO.getYieldRatioDown().toString());
            map.put("bendRatioTop", recordDTO.getBendRatioTop());
            map.put("bendRatioDown", recordDTO.getBendRatioDown().toString());
            map.put("elongationTop", recordDTO.getElongationTop());
            map.put("elongationDown", recordDTO.getElongationDown().toString());
            map.put("agtTop", recordDTO.getAgtTop());
            map.put("agtDown", recordDTO.getAgtDown().toString());
            map.put("gapTop", recordDTO.getGapTop());
            map.put("gapDown", recordDTO.getGapDown().toString());
            map.put("inspector", recordDTO.getInspector());
            map.put("dateValue", recordDTO.getDateValue());
            String filechirldName = DateUtils.getNowTimeStamp().toString();
            fileName = "pdf/" + filechirldName+ ".pdf";
            File pdfFile = new File(fileName);
            pdfFile.createNewFile();
            FileOutputStream fileOutputStream = new FileOutputStream(pdfFile, false);
            this.fillPdfCellForm(map, form);

            // 獲取頁面大小
            PdfReader pdfReader = new PdfReader("pdf/template.pdf");
            PdfDictionary pageDict = pdfReader.getPageN(1);
            PdfArray mediaBox = pageDict.getAsArray(PdfName.MEDIABOX);
            float pageWidth = mediaBox.getAsNumber(2).floatValue();
            float pageHeight = mediaBox.getAsNumber(3).floatValue();

            // 生成二維碼
            BarcodeQRCode qrCode = new BarcodeQRCode("https://XXXX.com/qrcode/"+filechirldName+".pdf", 200, 200, null);
            Image qrCodeImage = qrCode.getImage();
            qrCodeImage.scaleAbsolute(80, 80); // 設置二維碼圖片的大小

            // 計算二維碼的位置(右上角)
            float qrCodeX = pageWidth-80; // 80是右邊距
            float qrCodeY = pageHeight-80; // 80是上邊距
            qrCodeImage.setAbsolutePosition(qrCodeX, qrCodeY);

            // 將二維碼圖片添加到 PDF 中
            PdfContentByte contentByte = stamper.getOverContent(1);
            contentByte.addImage(qrCodeImage);

            stamper.setFormFlattening(true);
            stamper.close();
            reader.close();

            fileOutputStream.write(bos.toByteArray());
            fileOutputStream.close();
            // 上傳 oss
            Map<String, String> ossMap = AliYunOSSUtils.uploadFile(pdfFile, filechirldName+ ".pdf");
            if(StringUtils.isEmpty(ossMap.get("url"))){
                throw new RuntimeException("上傳oss 失敗");
            }
            pdfFile.delete();
            return ossMap.get("url");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("創建PDF失敗");
        }

    }

    /**
     * 設置pdf form cell 設置字體
     * @param map
     * @param form
     * @throws IOException
     * @throws DocumentException
     */
    private void fillPdfCellForm(Map<String, String> map, AcroFields form) throws IOException, DocumentException {

        if (baseFont == null) {
            baseFont = BaseFont.createFont("pdf/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        }
        for (Map.Entry entry : map.entrySet()) {
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            form.setFieldProperty(key, "textfont", baseFont, null);
            form.setField(key, value);
        }
    }

Excel 模板 欄位如何申明

Excel 模板

引入maven

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel-core</artifactId>
            <version>3.2.0</version>
            <scope>compile</scope>
        </dependency>

Java 代碼

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;


/**
     * 導出月均成本
     *
     * @param costBO
     * @return
     */
    @Override
    public String simpleFillExcel(MothlyCostBO costBO) {
        // 獲取當天的數據
        ProductionRecordMonthlyCostVO dayCostVO = LedgerReportMapper.ProductionPlanCostLedgerReportDetailByDay(costBO);
        // 當月 月初 到當前日期的 數據
        ProductionRecordMonthlyCostVO monthlyCostVO = LedgerReportMapper.ProductionPlanCostLedgerReportDetailByMonth(costBO);
        BigDecimal dayHost = LedgerReportMapper.ProductionPlanRecordHotShutTimeByDay(costBO);
        BigDecimal monthHost = LedgerReportMapper.ProductionPlanRecordHotShutTimeByMonth(costBO);

        ProductionExcelDownloadVO downloadVO = new ProductionExcelDownloadVO();

        // 每日可以為0
        if (JSONUtil.isNull(dayCostVO)) {
            dayCostVO = new MindaProductionRecordMonthlyCostVO();
            // 設置所有屬性為 BigDecimal.ZERO
            dayCostVO.setSumFurnace(BigDecimal.ZERO);
            dayCostVO.setSumSteel(BigDecimal.ZERO);
            dayCostVO.setSumFerromaganese(BigDecimal.ZERO);
            dayCostVO.setSumFurnacePower(BigDecimal.ZERO);
            dayCostVO.setSumFurnaceElectrode(BigDecimal.ZERO);
            dayCostVO.setSumFurnaceLime(BigDecimal.ZERO);
            dayCostVO.setSumCarBon(BigDecimal.ZERO);
            dayCostVO.setSumToner(BigDecimal.ZERO);
            dayCostVO.setSumFurnaceMagnesium(BigDecimal.ZERO);
            dayCostVO.setSumLox(BigDecimal.ZERO);
            dayCostVO.setSumFurnaceNatural(BigDecimal.ZERO);
            dayCostVO.setSumFurnaceThermocouple(BigDecimal.ZERO);
            dayCostVO.setSumFurnaceSampler(BigDecimal.ZERO);
            dayCostVO.setSumRefineLime(BigDecimal.ZERO);
            dayCostVO.setSumSilicoferrite(BigDecimal.ZERO);
            dayCostVO.setSumFluorite(BigDecimal.ZERO);
            dayCostVO.setSumCarburizer(BigDecimal.ZERO);
            dayCostVO.setSumInsulation(BigDecimal.ZERO);
            dayCostVO.setSumSilicon(BigDecimal.ZERO);
            dayCostVO.setSumSiliconAlloy(BigDecimal.ZERO);
            dayCostVO.setSumDeaerator(BigDecimal.ZERO);
            dayCostVO.setSumRefinePower(BigDecimal.ZERO);
            dayCostVO.setSumLiquid(BigDecimal.ZERO);
            dayCostVO.setSumRefineElectrode(BigDecimal.ZERO);
            dayCostVO.setSumRefineNatural(BigDecimal.ZERO);
            dayCostVO.setSumRefineThermocouple(BigDecimal.ZERO);
            dayCostVO.setSumRefineSampler(BigDecimal.ZERO);
            dayCostVO.setSumHighVanadium(BigDecimal.ZERO);
            dayCostVO.setSumCastingPowder(BigDecimal.ZERO);
            dayCostVO.setSumCastingInsulation(BigDecimal.ZERO);
            dayCostVO.setSumSaladOil(BigDecimal.ZERO);
            dayCostVO.setSumCopperPipe(BigDecimal.ZERO);
            dayCostVO.setSumCastingNatural(BigDecimal.ZERO);
            dayCostVO.setSumCastingThermocouple(BigDecimal.ZERO);
            dayCostVO.setSumPowerCasting(BigDecimal.ZERO);
            dayCostVO.setSumProtection(BigDecimal.ZERO);
            dayCostVO.setSumPump(BigDecimal.ZERO);
            dayCostVO.setSumDrive(BigDecimal.ZERO);
            dayCostVO.setSumOxygen(BigDecimal.ZERO);
        }
        // 每月不能為null
        if (monthlyCostVO.getSumDay().compareTo(BigDecimal.ZERO) > 0) {
            if (dayHost == null) {
                downloadVO = setterDownloadVO(dayCostVO, monthlyCostVO, BigDecimal.ZERO, monthHost, costBO);
            } else {
                downloadVO = setterDownloadVO(dayCostVO, monthlyCostVO, dayHost, monthHost, costBO);
            }
        }


        // 生成Excel文件
        String templateFileName = "pdf/cost1.xlsx";

        String filechirldName = DateUtils.getNowTimeStamp().toString();
        String outputFileName = "pdf/" + filechirldName + ".xlsx";
        try {
            // 填充數據
            ExcelWriter excelWriter =  EasyExcel.write(outputFileName)
                    .inMemory(true)
                    .withTemplate(templateFileName).build();
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            excelWriter.fill(downloadVO, writeSheet);
            excelWriter.writeContext().writeWorkbookHolder().getWorkbook();
            Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();
            workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); // 強制計算公式
            excelWriter.finish();

            File pdfFile = new File(outputFileName);
            // 上傳 oss
            Map<String, String> ossMap = AliYunOSSUtils.uploadFile(pdfFile, filechirldName + ".xlsx");
            if (StringUtils.isEmpty(ossMap.get("url"))) {
                throw new RuntimeException("上傳oss 失敗");
            }
            pdfFile.delete();
            return ossMap.get("url");

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("填充Excel失敗");
        }
    }

本文來自博客園,作者:depressiom,轉載請註明原文鏈接:https://www.cnblogs.com/depressiom/p/18393147


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

-Advertisement-
Play Games
更多相關文章
  • 日誌處理logging 一、日誌輸出 日誌預設的輸出等級為:waring級別及以上的等級 修改日誌的預設輸出等級通過logging.basicConfig(level='INFO') 記錄日誌列印時間:logging.basicConfig(format=console_fmt) console_f ...
  • 一、 六大設計原則 1. 單一職責原則:應該有且僅有一個原因引起類的變更 2. 里氏替換原則:子類可替換父類。 a) 子類必須完全實現父類的方法 b) 子類可以有自己的個性 c) 子類實現父類方法時,入參可放大 d) 子類實現父類方法時,輸出參數可縮小 3. 依賴倒置原則:高層模塊不應該依賴底層模塊 ...
  • 事件匯流排(在有些框架中也稱時間聚合器,如Prism的EventAggregater)是訂閱-發佈模式的一種實現,類似觀察者模式,相對於觀察者模式,事件匯流排更靈活,它是一種集中處理事件的模式,允許不同組件之間通信,降低耦合度。 事件匯流排的三要素:事件源(事件的定義)、發佈事件(觸發事件)、訂閱事件(事 ...
  • IT統一運維平臺案例統一運維平臺的架構圖,劃分為三個主要部分:統一運維門戶、報告與決策中心、運維服務調度中心。以下是對每個部分的解析:1. 統一運維門戶這是用戶的統一入口,提供了一系列運維相關的服務和功能,包括:綜合信息發佈:發佈運維相關的信息,如公告、通知等。 自助服務台:用戶可以通過自助服務台提 ...
  • 在 Python 中,內置類型的行為是通過一組特殊的“魔法方法”來實現的,這些魔法方法以雙下劃線開頭和結尾,比如 init 和 str,你可以通過重寫這些魔法方法來定製或擴展內置類型的行為。 ...
  • 【前言】網上各種面試八股文太多太多,但我今年找了好幾個都是很久很久以前的老面試題,老文檔了,和我出去面試市場上面試官問的問題基本上不一樣了,可以說被打了一個措手不及,浪費了好幾個機會,回來又找了好一些資料,以及結合自己最近的面試情況總結了一些心得免費分享給大家!雖然只有幾本電子文檔,但是濃縮的都是精 ...
  • 2018年7月,大三暑假進行時,時間過得飛快,我到這邊實習都已經一個月了。 我在沒工作之前,我老是覺得生產項目的代碼跟我平時自學練的會有很大的區別。 以為生產項目代碼啥的都會規範很多,比如在介面上會做很多安全性的工作(自學練的時候確實學到的類似的案例),代碼設計上會有很多設計模式的應用。 但實際上, ...
  • 為什麼需要SPI機制 SPI和API的區別是什麼 SPI是一種跟API相對應的反向設計思想:API由實現方確定標準規範和功能,調用方無權做任何干預; 而SPI是由調用方確定標準規範,也就是介面,然後調用方依賴此介面,第三方實現此介面,這樣做就可以方便的進行擴展,類似於插件機制,這是SPI出現的需求背 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...