最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java導出pdf文件的詳細實現(xiàn)方法

 更新時間:2025年03月15日 10:55:02   作者:lmxnsI  
這篇文章主要介紹了java導出pdf文件的詳細實現(xiàn)方法,包括制作模板、獲取中文字體文件、實現(xiàn)后端服務以及前端發(fā)起請求并生成下載鏈接,需要的朋友可以參考下

使用注意點

因為原來制作的pdf表單內(nèi)容過于復雜,下面代碼只包含前兩行的操作。

本次操作需要前端向后端發(fā)起請求,后端返回數(shù)據(jù)給前端用于下載,所以沒有在本地進行保存。

第 1 步制作pdf模板需要的pdf編輯軟件基本上都需要錢,可以去買一個

第 2 步獲取的pdf導出的中文需要的文件,如果pdf輸出的內(nèi)容有中文就需要去弄一下這個文件,在代碼中用于讀取設置中文字體

包含內(nèi)容

1、導出pdf

2、設置斜體水印

1、制作pdf模板

先將需要的pdf模板通過word制作出來,然后導出為pdf

使用Adobe Acrobat DC 打開并制作模板(其他pdf編輯軟件也可以)

選擇打開前面導出的pdf模板

點擊準備表單

點擊之后,可以針對沒一個位置進行編輯,選中雙擊就可以進行編輯了,要注意,每個位置的名字都需要是唯一的

全部賦值后保存即可

2、獲取pdf導出中文需要的文件

獲取中文字體需要的文件

在電腦這個路徑下選擇下載一個就行

3、實現(xiàn)

pom依賴

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.3</version>
    <type>pom</type>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

controller接口

    @GetMapping("/exportPDF/{applyId}")
    public ResponseEntity<byte[]> exportPDF(@PathVariable("applyId") String applyId, HttpServletResponse response) throws IOException,ParseException,Exception {

        byte[] res = applyService.exportPDF(applyId);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment; filename=filled_form.pdf");
        headers.add("Content-Type", "application/pdf");

        return ResponseEntity.ok()
                .headers(headers)
                .body(res);
    }

service具體實現(xiàn)

	public static byte[] exportPDF1() throws Exception {
        String inputTemplateName = "template";
        try {
            pdfBytes = null;
            Map<String, String> map = new HashMap<>();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

            // map預填數(shù)據(jù),用于后面讀取輸出到pdf文件上
            map.put("department-1", "研發(fā)中心");
            map.put("submitDate-1", sdf.format(new Date()));
            map.put("submitPerson-1", "張三");
            map.put("travelPerson-1", "李四");
            map.put("receivePerson-1","王五");

            // 設置中文字體
            PdfFont chineseFont = PdfFontFactory.createFont("src/main/resources/file/simsun.ttc,0");

            // 模板路徑
            String templatePath = "src\\main\\resources\\file\\" + inputTemplateName + ".pdf";

            // 重點,這一個關聯(lián)了reader 和 writer
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

            // 讀取文件
            FileInputStream pdfInputStream = new FileInputStream(new File(templatePath));
            // 定義 reader 和writer
            PdfReader reader = new PdfReader(pdfInputStream);
            PdfWriter writer = new PdfWriter(byteArrayOutputStream,new WriterProperties().setStandardEncryption(
                    null,
                    null,
                    EncryptionConstants.ALLOW_PRINTING, // 允許打印
                    EncryptionConstants.ENCRYPTION_AES_128 // 加密方式
            ));

            // 根據(jù) reader 和writer 創(chuàng)建 PdfDocument
            PdfDocument pdfDocument = new PdfDocument(reader,writer);

            // 下面是給文件添加水印,不需要的可以直接刪掉
            // 獲取 pdf 模板頁數(shù)
            int numberOfPages = pdfDocument.getNumberOfPages();

            // 遍歷每一頁并添加水印
            for (int i = 1; i <= numberOfPages; i++) {
                PdfPage page = pdfDocument.getPage(i);

                // 獲取頁面尺寸(在這里我沒有用)
                int pageWidth = (int) Math.floor(page.getPageSize().getWidth());
                int pageHeight = (int) Math.floor(page.getPageSize().getHeight());

                // 創(chuàng)建一個 PdfCanvas 對象
                PdfCanvas canvas = new PdfCanvas(page);

                // 保存當前坐標系狀態(tài)
                canvas.saveState();

                // 水印內(nèi)容旋轉
                double angle = Math.toRadians(45);
                double cos = Math.cos(angle);
                double sin = Math.sin(angle);
                canvas.concatMatrix(cos, sin, -sin, cos, 0, 0);

                // 設置水印的字體和透明度
                canvas.setFontAndSize(PdfFontFactory.createFont(), 20);
                canvas.setFillColorRgb(0.75f, 0.75f, 0.75f);  // 灰色
                canvas.setLineWidth(2);

                // 正常應該根據(jù)獲取到的頁面尺寸進行 x y 軸的遍歷并
                // 但是我這邊沒有鋪滿,就自己設置了遍歷的范圍
                for (int x = -90; x < 2000; x += 300) {
                    for (int y = -190; y < 2000; y += 200) {
                        // 繪制水印文字
                        canvas.beginText();
                        canvas.setTextMatrix(x, y);  // 設置水印位置
                        canvas.showText("Watermark Text this is just a test");  // 水印文字內(nèi)容
                        canvas.endText();
                    }
                }

                // 恢復坐標系狀態(tài)
                canvas.restoreState();

            }

            // form 可以理解為把pdf文件看做一個form表單,以key value鍵值對保存
            PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDocument, true);

            // 遍歷上面預填的 map 并將值根據(jù) key 賦值到form
            for (Map.Entry<String, String> entry : map.entrySet()) {
                form.getField(entry.getKey()).setValue(entry.getValue());
                form.getField(entry.getKey()).setFont(chineseFont).setFontSize(8);
            }
            pdfDocument.close();
            // 返回文件流
            pdfBytes = byteArrayOutputStream.toByteArray();

            return pdfBytes;

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            return pdfBytes;
        }
    }

4、前端發(fā)起請求并生成下載鏈接

	exportPdf(applyId) {
      exportPDF(applyId).then(res => {
        // 創(chuàng)建一個 Blob 對象,指定類型為 PDF 文件
        const blob = new Blob([res.data], { type: 'application/pdf' });

        // 創(chuàng)建一個 URL 對象,指向 Blob 數(shù)據(jù)
        const url = URL.createObjectURL(blob);

        // 創(chuàng)建一個下載鏈接
        const link = document.createElement('a');
        link.href = url;
        link.download = 'generated_with_form.pdf'; // 設置下載文件名

        // 模擬點擊下載鏈接
        link.click();

        // 下載完成后釋放 URL 對象
        URL.revokeObjectURL(url);
      })
    },

總結 

到此這篇關于java導出pdf文件的詳細實現(xiàn)方法的文章就介紹到這了,更多相關java導出pdf文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java利用POI讀取excel文件的方法

    java利用POI讀取excel文件的方法

    這篇文章主要介紹了java利用POI讀取excel文件的方法,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-12-12
  • Java多線程——之一創(chuàng)建線程的四種方法

    Java多線程——之一創(chuàng)建線程的四種方法

    這篇文章主要介紹了Java創(chuàng)建線程方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 將本地服務注冊到nacos上的實現(xiàn)過程

    將本地服務注冊到nacos上的實現(xiàn)過程

    文章介紹了如何在本地安裝和啟動Nacos服務,并配置本地應用程序使用Nacos進行服務注冊,文章強調(diào)了啟動日志窗口的重要性,并提供了一個簡短的總結,希望對讀者有所幫助
    2026-01-01
  • Java輸出打印工具類封裝的實例

    Java輸出打印工具類封裝的實例

    下面小編就為大家?guī)硪黄狫ava輸出打印工具類封裝的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • MyBatis實現(xiàn)多表聯(lián)合查詢resultType的返回值

    MyBatis實現(xiàn)多表聯(lián)合查詢resultType的返回值

    這篇文章主要介紹了MyBatis多表聯(lián)合查詢resultType的返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java對象深復制與淺復制實例詳解

    Java對象深復制與淺復制實例詳解

    這篇文章主要介紹了 Java對象深復制與淺復制實例詳解的相關資料,需要的朋友可以參考下
    2017-05-05
  • 從繁瑣到簡潔的Jenkins?Pipeline腳本優(yōu)化實踐

    從繁瑣到簡潔的Jenkins?Pipeline腳本優(yōu)化實踐

    這篇文章主要為大家介紹了從繁瑣到簡潔的Jenkins?Pipeline腳本優(yōu)化實踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java詳細分析講解泛型

    Java詳細分析講解泛型

    在正式進入內(nèi)容之前說明一下:泛型的內(nèi)容太多,也太復雜。這里因為Java中寫數(shù)據(jù)結構的時候會使用到,所以加上。關于泛型我找了挺多文章,再結合自己的理解,盡可能將其講清楚。不求會使用泛型,只要求后面數(shù)據(jù)結構出現(xiàn)泛型的時候能夠知道是在干什么即可
    2022-05-05
  • java中對象轉json字符串的三種常用方式

    java中對象轉json字符串的三種常用方式

    本文主要介紹了java中對象轉json字符串的三種常用方式,包含Jackson庫,Gson庫和Hutool工具類這三種,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 你知道Java的這些騷操作嗎?

    你知道Java的這些騷操作嗎?

    今天在看python相關的東西,看到各種騷操作,回頭想了下Java有沒有什么騷操作,整理下面幾種,一起看一下吧,需要的朋友可以參考下
    2021-05-05

最新評論

惠州市| 淳安县| 望江县| 临澧县| 凌源市| 乌兰浩特市| 驻马店市| 崇阳县| 鄂伦春自治旗| 长丰县| 红安县| 颍上县| 武鸣县| 万载县| 微山县| 治县。| 华蓥市| 手机| 盐边县| 耿马| 浪卡子县| 利辛县| 涿鹿县| 波密县| 唐海县| 石家庄市| 长岭县| 铜陵市| 靖州| 白沙| 九龙坡区| 夏津县| 潞西市| 克什克腾旗| 博爱县| 靖江市| 乐昌市| 石狮市| 沂南县| 富平县| 泾阳县|