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

JAVA純代碼導(dǎo)出PDF文件實(shí)現(xiàn)方式

 更新時間:2025年01月02日 11:01:50   作者:桃花面包  
本文介紹了作者通過突發(fā)奇想發(fā)布了生成PDF的博客,最初,作者通過將Word文件轉(zhuǎn)換為PDF文件實(shí)現(xiàn)導(dǎo)出PDF功能,但效果不盡如人意,后來,作者嘗試直接生成PDF文件,并修復(fù)了生成PDF時出現(xiàn)的小瑕疵,通過導(dǎo)入依賴、下載接口和下載方法的實(shí)現(xiàn)

JAVA純代碼導(dǎo)出PDF文件

突發(fā)奇想,發(fā)布一篇生成pdf的博客。最初做導(dǎo)出pdf文件還是剛接觸項(xiàng)目的時候,從最邊緣的功能開始..........

想要實(shí)現(xiàn)導(dǎo)出PDF文件,但是當(dāng)時已經(jīng)生成了對應(yīng)的Word文件,就想著直接把Word文件轉(zhuǎn)為PDF就好了,還方便格式什么的都實(shí)現(xiàn)了,最后花了很大力氣是實(shí)現(xiàn)了,但是效果不盡人意,就想著要不然直接生成PDF得了,后續(xù)就是看了一些博客,仿照著實(shí)現(xiàn)了導(dǎo)出PDF文件,但是自己最終實(shí)現(xiàn)效果有一點(diǎn)小瑕疵,一直沒有空去有哈一下,最近有點(diǎn)空閑時間查了一下資料,把這個小瑕疵修復(fù)掉了。

好了....到此上效果圖:

(1)這是正常情況:

(2)這是特殊情況

會出現(xiàn)第二種情況是因?yàn)橐坏┑诙械臄?shù)據(jù)太多,第一頁放不下的時候,就會強(qiáng)制分頁。

其實(shí)在table對象上設(shè)置一個屬性就好:

// 這個方法可以告訴iText在遇到需要分頁的情況時,不要延遲分頁,而是立即分頁。這樣可以避免表格的一部分內(nèi)容被拆分到兩頁之間。
table2.setSplitLate(false);

接下來最主要的代碼部分

1.首先是導(dǎo)入依賴

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
 </dependency>

2.下載接口

@GetMapping("/download")
    public void download(HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException {
        // 防止日志記錄獲取session異常
        request.getSession();
        // 設(shè)置編碼格式
        response.setContentType("application/pdf;charset=UTF-8");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("下載的PDF名稱", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".pdf");
        download1(response);
    }

3.下載方法實(shí)現(xiàn)

public void download1(HttpServletResponse response) {

        //要下載的數(shù)據(jù)查詢數(shù)據(jù)部分我去掉了有需要自己根據(jù)業(yè)務(wù)取
        ArrayList<Map<String, Object>> list = new ArrayList<>();
        HashMap<String, Object> resultMap = new HashMap<>();

        HashMap<String, Object> resultMap1 = new HashMap<>();
        resultMap1.put("xm", "002");
        resultMap1.put("zw", "李四");
        resultMap1.put("zyzg","男");
        resultMap1.put("stzk", "2001-12-36");
        resultMap1.put("xyrwfg", "150269200110292012");
        resultMap1.put("sfwb", "18722061569");
        list.add(resultMap1);

        // 測試數(shù)據(jù)---實(shí)際將數(shù)據(jù)換為業(yè)務(wù)數(shù)據(jù)就ok
        HashMap<String, Object> resultMap2 = new HashMap<>();
        resultMap2.put("xm", "001");
        resultMap2.put("zw", "張三");
        resultMap2.put("zyzg", "在一片寧靜的山谷之中,有一座古老的小鎮(zhèn),鎮(zhèn)上的人們過著與世無爭的生活。每當(dāng)春天來臨,山谷里的桃花便會競相開放,將整個小鎮(zhèn)裝扮得如同仙境一般。小鎮(zhèn)的居民們會在這個時候舉行盛大的花節(jié),慶祝春天的到來。孩子們穿著節(jié)日的盛裝,在花叢中嬉戲;老人們則坐在樹下,享受著溫暖的陽光,講述著過去的故事。這里的每一磚一瓦,每一草一木,都承載著歲月的記憶,讓人感受到一種悠然自得的生活態(tài)度。隨著時間的流逝,雖然外界的世界日新月異,但這座小鎮(zhèn)依舊保持著它獨(dú)有的寧靜與美好,成為了一個遠(yuǎn)離喧囂的理想之地。在一片寧靜的山谷之中,有一座古老的小鎮(zhèn),鎮(zhèn)上的人們過著與世無爭的生活。每當(dāng)春天來臨,山谷里的桃花便會競相開放,將整個小鎮(zhèn)裝扮得如同仙境一般。小鎮(zhèn)的居民們會在這個時候舉行盛大的花節(jié),慶祝春天的到來。孩子們穿著節(jié)日的盛裝,在花叢中嬉戲;老人們則坐在樹下,享受著溫暖的陽光,講述著過去的故事。這里的每一磚一瓦,每一草一木,都承載著歲月的記憶,讓人感受到一種悠然自得的生活態(tài)度。隨著時間的流逝,雖然外界的世界日新月異,但這座小鎮(zhèn)依舊保持著它獨(dú)有的寧靜與美好,成為了一個遠(yuǎn)離喧囂的理想之地。");
        resultMap2.put("stzk", "2000-01-01");
        resultMap2.put("xyrwfg", "185214563257994512");
        resultMap2.put("sfwb", "13546235689");
        list.add(resultMap2);

        resultMap.put("xm", "006");
        resultMap.put("zw", "老六");
        resultMap.put("zyzg","男");
        resultMap.put("stzk", "2003-01-09");
        resultMap.put("xyrwfg", "120229186902101236");
        resultMap.put("sfwb", "15935262569");
        list.add(resultMap);

        // 定義全局的字體靜態(tài)變量
        Font content = null;
        BaseFont bf;
        
        try {
            // 不同字體(這里定義為同一種字體:包含不同字號、不同style)
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            content = new Font(bfChinese, 10, Font.NORMAL);
            //創(chuàng)建字體
            bf = BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H",
                    BaseFont.NOT_EMBEDDED);
            
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 創(chuàng)建文檔對象
        Document document = new Document(new RectangleReadOnly(842F, 595F));
        //設(shè)置頁邊距  60:左邊距,60:右邊距,72:上邊距,72:下邊距
        document.setMargins(60, 60, 72, 72);

        try {
            PdfWriter writer = PdfWriter.getInstance(document,response.getOutputStream());
            //添加頁碼
            //添加頁碼
            PdfHeaderFooterEvent event = new PdfHeaderFooterEvent();
            writer.setPageEvent(event);
            //打開生成的pdf文件
            document.open();

            PdfPCell cell = null;

            // 設(shè)置表格的列寬和列數(shù)
            float[] widths2 = {25f,25f,25f,25f,25f,25f};
            PdfPTable table2 = new PdfPTable(widths2);
            table2.setSpacingBefore(20f);
            // 設(shè)置表格寬度為100%
            table2.setWidthPercentage(100.0F);
            table2.setHeaderRows(1);
            table2.getDefaultCell().setHorizontalAlignment(1);

            // 創(chuàng)建表頭  content: 字體
            tableHeader(content, table2);

            // 填充內(nèi)容
            setContentData(list, content, table2);

            document.add(new Paragraph("\n"));
            document.add(new Paragraph("▋ 基本信息",content));
            document.add(new Paragraph("\n"));
            // 設(shè)置分頁策略
            table2.setSplitLate(false);
            document.add(table2);
            //關(guān)閉文檔
            document.close();


        } catch (DocumentException | IOException e) {
            e.printStackTrace();

        }

    }

設(shè)置表頭信息:

private static void tableHeader(Font content, PdfPTable table2) {
        PdfPCell cell;
        cell = new PdfPCell(new Paragraph("學(xué)號", content));
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setFixedHeight(20);
        table2.addCell(cell);

        cell = new PdfPCell(new Paragraph("姓名", content));
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        table2.addCell(cell);

        cell = new PdfPCell(new Paragraph("性別", content));
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        table2.addCell(cell);

        cell = new PdfPCell(new Paragraph("出生日期", content));
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        table2.addCell(cell);

        cell = new PdfPCell(new Paragraph("身份證號碼", content));
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        table2.addCell(cell);

        cell = new PdfPCell(new Paragraph("聯(lián)系電話", content));
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        table2.addCell(cell);
    }

填充表中數(shù)據(jù):

private static void setContentData(ArrayList<Map<String, Object>> list, Font content, PdfPTable table2) {
        if(list.size() > 0){
            for (Map<String, Object> map : list) {
                PdfPCell cell1 = new PdfPCell(new Paragraph(map.get("xm").toString(), content));
                PdfPCell cell2 = new PdfPCell(new Paragraph(map.get("zw").toString(), content));
                PdfPCell cell3 = new PdfPCell(new Paragraph(map.get("zyzg").toString(), content));
                PdfPCell cell4 = new PdfPCell(new Paragraph(map.get("stzk").toString(), content));
                PdfPCell cell5 = new PdfPCell(new Paragraph(map.get("xyrwfg").toString(), content));
                PdfPCell cell6 = new PdfPCell(new Paragraph(map.get("sfwb").toString(), content));

                //單元格對齊方式
                cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell1.setFixedHeight(20);
                //單元格垂直對齊方式
                cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);

                cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);

                cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);

                cell5.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell5.setVerticalAlignment(Element.ALIGN_MIDDLE);

                cell6.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell6.setVerticalAlignment(Element.ALIGN_MIDDLE);

                table2.addCell(cell1);
                table2.addCell(cell2);
                table2.addCell(cell3);
                table2.addCell(cell4);
                table2.addCell(cell5);
                table2.addCell(cell6);
            }
        }
    }

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Intellij IDEA中啟動多個微服務(wù)(開啟Run Dashboard管理)

    Intellij IDEA中啟動多個微服務(wù)(開啟Run Dashboard管理)

    這篇文章主要介紹了Intellij IDEA中啟動多個微服務(wù)(開啟Run Dashboard管理),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Spring Boot快速搭建Spring框架教程

    Spring Boot快速搭建Spring框架教程

    這篇文章主要為大家詳細(xì)介紹了Spring Boot快速搭建Spring框架教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 深入了解java中常見的五種比較方法

    深入了解java中常見的五種比較方法

    在程序的世界里面,比較也是必不可少的,通過比較可以確定對象的相對順序、相等性以及其他比較條件,下面我們就來深入了解一下java中常見的五種比較方法吧
    2023-12-12
  • Java實(shí)現(xiàn)WGS84/百度/騰訊/高德等主流的地理坐標(biāo)轉(zhuǎn)換

    Java實(shí)現(xiàn)WGS84/百度/騰訊/高德等主流的地理坐標(biāo)轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)WGS84,百度,騰訊,高德等主流的地理坐標(biāo)轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-12-12
  • spring boot實(shí)戰(zhàn)之本地jar包引用示例

    spring boot實(shí)戰(zhàn)之本地jar包引用示例

    本篇文章主要介紹了spring boot實(shí)戰(zhàn)之本地jar包引用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • @RunWith(SpringJUnit4ClassRunner.class)報(bào)錯問題及解決

    @RunWith(SpringJUnit4ClassRunner.class)報(bào)錯問題及解決

    這篇文章主要介紹了@RunWith(SpringJUnit4ClassRunner.class)報(bào)錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 解決kafka消息堆積及分區(qū)不均勻的問題

    解決kafka消息堆積及分區(qū)不均勻的問題

    這篇文章主要介紹了解決kafka消息堆積及分區(qū)不均勻的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java 使用getClass().getResourceAsStream()方法獲取資源

    Java 使用getClass().getResourceAsStream()方法獲取資源

    這篇文章主要介紹了Java 使用getClass().getResourceAsStream()方法獲取資源的相關(guān)資料,這里主要講解哪種方式可以獲取到文件資源,需要的朋友可以參考下
    2017-07-07
  • Java中的static關(guān)鍵字全面解析

    Java中的static關(guān)鍵字全面解析

    這篇文章主要介紹了Java中的static關(guān)鍵字全面解析的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的示例代碼

    SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的示例代碼

    本文介紹了使用Redisson實(shí)現(xiàn)分布式鎖以解決并發(fā)預(yù)約號源超賣問題,首先添加Redisson依賴并配置RedissonClient,接著在預(yù)約服務(wù)中引入分布式鎖,并自定義扣減號源方法,最后總結(jié)了分布式鎖的實(shí)現(xiàn)原理,包括鎖粒度、鎖超時、可重入性和WatchDog機(jī)制,需要的朋友可以參考下
    2026-04-04

最新評論

太仆寺旗| 林芝县| 历史| 辽阳县| 历史| 白水县| 兴业县| 宝清县| 枣阳市| 云梦县| 鲁山县| 怀集县| 滦平县| 桃园县| 雅安市| 寿阳县| 资溪县| 漳平市| 昭苏县| 光泽县| 民县| 北宁市| 临高县| 隆安县| 西乌珠穆沁旗| 宜良县| 历史| 二连浩特市| 城市| 紫金县| 昌江| 西和县| 仲巴县| 黔江区| 石门县| 花莲市| 甘德县| 赣榆县| 黄大仙区| 乃东县| 扶绥县|