Java实现PDF导出/预览

这篇具有很好参考价值的文章主要介绍了Java实现PDF导出/预览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        网上有很多关于PDF导出的文章,但是个人感觉实现的过于复杂,又是模板又是html的,有的还需要字体模板的支持,本片文章只是实现简单的PDF表格导出,可以实现PDF动态表格导出/预览,这类文章网上很少,就给你们整理一篇吧!

实现思路:本地创建PDF文件 --》打开PDF文件 --〉写入各种数据 --》保存PDF --〉 将PDF输出到页面下载 --》 删除本地PDF文件

第一步:导入相关的依赖,如果原来有依赖记得替换一下哦,免得版本不一致导致其他产生的各种问题。

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.5</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>

 第二步:创建所需要的实体类

package com.hyper.pdf;

import lombok.Data;

/**
 * 标题名称/内容设置实体类
 */
@Data
public class ProcessVo {
    /**
     * 序号
     */
    private String index;
    /**
     * 审核人
     */
    private String assignee;
    /**
     * 审核人名称
     */
    private String assigneeName;
    /**
     * 审核时间
     */
    private String verifyTime;
    /**
     * 审核结果
     */
    private String verifyResult;
    /**
     * 审核意见
     */
    private String verifyMessage;
}
package com.hyper.pdf;

import lombok.Data;

import java.util.List;

@Data
public class ProcessTaskVo {
    private  String taskName="审核人";
    private  String startUserName="审核发起人";
    private  String startTime="2022-03-04";
    /**
     * 导出的数据 processVoList
     */
    private List<ProcessVo> processVoList;
}

第三步:所有代码我都放到了控制层里面,各位自行开发细化,按照自己的要求调整即可。

package com.hyper.web;

import cn.hutool.core.bean.BeanUtil;
import com.amazonaws.util.IOUtils;
import com.hyper.pdf.ProcessTaskVo;
import com.hyper.pdf.ProcessVo;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/pdf")
public class HelloController {

    @GetMapping("/pdf")
    public void processPdfSample(HttpServletRequest request, HttpServletResponse response) {
        ProcessTaskVo processTaskVo = new ProcessTaskVo();
        // 扩大指针作用域
        Document document = null;
        ByteArrayOutputStream fileOut = new ByteArrayOutputStream();
        OutputStream responseOutputStream = null;
        try {
            // 导出PDF文件名称
            final String pdfDocName = "周报" + ".pdf";
            // 系统路径
            File file = new File(pdfDocName);
            file.createNewFile();
            //1:建立Document对象实例
            document = new Document();
            StringBuilder filename = new StringBuilder();
            //PDF标题
            String pdfName = "测试导出的PDF";
            filename.append(pdfName).append(new SimpleDateFormat("yyyyMMddHHmm").format(new
                    Date()));
            document.addAuthor("Author@SALES");
            document.addCreationDate();
            document.addCreator("Creator@SALES");
            document.setMargins(10, 10, 10, 10);

            PdfWriter pdfWriter = PdfWriter.getInstance(document, fileOut);
            pdfWriter.setPdfVersion(PdfWriter.VERSION_1_4);
            // 3:打开文档
            document.open();

            //解决中文不显示问题
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Font fontChina14 = new Font(bfChinese, 14);
            Font fontChina12 = new Font(bfChinese, 12);

            // 4:向文档添加内容
            Paragraph titleParagraph = new Paragraph(pdfName, fontChina14);
            // 居中
            titleParagraph.setAlignment(Element.ALIGN_CENTER);
            document.add(titleParagraph);
            // 空格
            Paragraph blank1 = new Paragraph(" ");
            document.add(blank1);
            // 表格处理及查询数据
            java.util.List<ProcessVo> processVoLists = new ArrayList<>();
            for (int i = 0; i < 30; i++) {
                ProcessVo processVo1 = new ProcessVo();
                processVo1.setIndex(i+"");
                processVo1.setAssignee("李四");
                processVo1.setAssigneeName("张三");
                processVo1.setVerifyTime("2022-03-04");
                processVo1.setVerifyResult("通过");
                processVoLists.add(processVo1);
            }

            processTaskVo.setProcessVoList(processVoLists);
            PdfPTable table = packageTable(processTaskVo, fontChina12);
            if (null != table) {
                document.add(table);
            }
            // 5:关闭文档
            document.close();
            //注释可在线预览
            witerFile(request, response, file, false);
            responseOutputStream = response.getOutputStream();
            fileOut.writeTo(responseOutputStream);
            responseOutputStream.close();
            //删除文件
            file.delete();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fileOut.close();
                responseOutputStream.close();
            } catch (IOException exception) {
                System.out.printf("下载异常");
            }
        }
    }

    /**
     * 写出文件
     *
     * @param request
     * @param response
     * @param file
     * @param deleteOnExit
     */
    private void witerFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit) {
        response.setCharacterEncoding(request.getCharacterEncoding());
        response.setContentType("application/pdf");
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            //这里主要防止下载的PDF文件名乱码
            String fileName = URLEncoder.encode(file.getName(), "UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            IOUtils.copy(fis, response.getOutputStream());
            response.flushBuffer();
        } catch (Exception e) {
            System.out.printf("下载异常111");
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                    if (deleteOnExit) {
                        file.deleteOnExit();
                    }
                } catch (IOException e) {
                    System.out.printf("下载异常222");
                }
            }
        }
    }

    public static PdfPTable packageTable(ProcessTaskVo processTaskVo, Font fontZH) {
        try {
            // 创建table下面通过table.addCell添加的时候必须添加整行内容的所有列
            PdfPTable table = new PdfPTable(6);
            table.setWidthPercentage(100.0F);
            //第一行是列表名
            table.setHeaderRows(1);
            table.getDefaultCell().setHorizontalAlignment(1);
            java.util.List<ProcessVo> processVoList = processTaskVo.getProcessVoList();

            if (null != processVoList && processVoList.size() > 0) {
                List<ProcessVo> newProcessVoList = new ArrayList<>();
                ProcessVo processVo = new ProcessVo();
                processVo.setIndex("数据1");
                processVo.setAssignee("审批人2");
                processVo.setAssigneeName("审批人姓名3");
                processVo.setVerifyTime("审批时间");
                processVo.setVerifyResult("审批结果");
                processVo.setVerifyMessage("审批意见");
                newProcessVoList.add(processVo);

                for (ProcessVo tableProcessVo : processVoList) {
                    ProcessVo newProcessVo = new ProcessVo();
                    BeanUtil.copyProperties(tableProcessVo, newProcessVo);
                    newProcessVoList.add(newProcessVo);
                }
                //遍历List 获取每一列的数据,填充到pdfTable中
                newProcessVoList.forEach(vo -> {
                    table.addCell(createCell(vo.getIndex(), fontZH));
                    table.addCell(createCell(vo.getAssignee(), fontZH));
                    table.addCell(createCell(vo.getAssigneeName(), fontZH));
                    table.addCell(createCell(vo.getVerifyTime(), fontZH));
                    table.addCell(createCell(vo.getVerifyResult(), fontZH));
                    table.addCell(createCell(vo.getVerifyMessage(), fontZH));
                });
            }
            //cell跨页
            table.setKeepTogether(false);
            table.setSplitLate(false);
            table.setSplitRows(true);
            return table;
        } catch (Exception e) {
            return null;
        }
    }
    private static PdfPCell createCell(String value, Font fontZH) {
        PdfPCell cell = new PdfPCell();
        cell.setPhrase(new Phrase(value, fontZH));
        cell.setColspan(1);
        cell.setUseAscender(true);
        cell.setUseDescender(true);
        //水平居中
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        //垂直居中
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        return cell;
    }
}

最后实现的效果如下,可以实现预览后下载的,具体的话看代码备注,上面代码应该是全的,如果发现有漏掉的代码或者依赖可以留言作者,定会第一时间完善的。

java pdf 预览,pdf

 文章来源地址https://www.toymoban.com/news/detail-563756.html

到了这里,关于Java实现PDF导出/预览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 接了个变态需求:生成 Excel + PDF 导出,用 Java 怎么实现?

    Excel、PDF的导出、导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策。 公司有这么两个需求: 需求一 、给了一个表单,让把查出来的数据组装到表单中并且提供以PDF格式的下载功能。 需求二、  将

    2024年02月20日
    浏览(34)
  • java中预览pdf或者图片

       

    2024年02月12日
    浏览(32)
  • Java后端返回PDF预览给前端

    前端要预览服务器PDF 可直接将要blob流返回给前端 即可用浏览器自带pdf预览功能打开,现有两种方式 方式1 返回blob流给前端 代码如下        此时 前端解析可直接拿返回的文件流 例子如下 但有的时候 不想返回文件流 可把文件返回为base64 (注意 base64可能超长)此时代码修

    2024年02月08日
    浏览(44)
  • java超简单实现文档在线预览功能,支持word\excel\text\pdf\图片等格式转pdf,aspost 转pdf部署linux中文乱码解决方案

    一、背景         在工作中需要对上传到服务器的各种类型包括但不限于word、pdf、excel等文件进行在线预览,前端比较菜搞不定,只能本人亲自上。         网上的经验比较多也比较乱, 有的只有预览,没有文件格式转换,有的也不说linux存在字体问题, 本文会直白的给

    2024年04月10日
    浏览(53)
  • Java导出PDF文档(模板导出和自定义)

    需要导出PDF文档,支持模板导出和自定义文档格式。 PDF模板创建可使用表单域创建表单字段,引入数据填充,或者根据实际需要生成html转换成pdf。 PDF模板可以考虑使用PDF编辑器编辑,创建表单域,配置好相应字段      

    2024年02月16日
    浏览(37)
  • java使用poi-tl导出word及转换PDF后的合并导出pdf

    为某单位开发的一款项目申报审批系统,用户需求在申报阶段填写的信息资料能够导出PDF。且项目申报的报告正文为用户上传,所以需要合并导出。 在项目初期阶段使用的是PDF的预设模板导出,因为以前使用过,比较熟悉。所以优先选择此方法,但项目测试阶段发现问题,因

    2024年02月06日
    浏览(62)
  • Java + React导出Excel/PDF

    前言 在B/S架构中,服务端导出是一种高效的方式。它将导出的逻辑放在服务端,前端仅需发起请求即可。通过在服务端完成导出后,前端再下载文件完成整个导出过程。服务端导出具有许多优点,如数据安全、适用于大规模数据场景以及不受前端性能影响等。 本文将使用前

    2024年02月10日
    浏览(31)
  • Java导出PDF(itextpdf)-通俗易懂

    在java开发的过程中会遇到太多太多文档pdf导出,excle导出等业务场景,时隔三个月或半年来一次每一次遇到这样的业务场景对我都是非常痛苦的过程,本文旨在记录工具类使用方法和技术分享。 itextpdf是一个开源的Java库,用于创建和操作PDF文档。使用itextpdf,您可以创建新的

    2024年02月12日
    浏览(37)
  • java按照模板导出pdf或者word

    (一)制作模板  1、在word里制作模板         因为PDF常用的软件不支持编辑,所以先用Word工具,如WPS或者Office新建一个空白Word文档,里面制作出自己想要的样式。 2、 将Word转换成PDF形式          将设置好的Word文档转换成PDF形式,保存起来。 3、编辑PDF准备表单 

    2024年02月06日
    浏览(40)
  • java springboot2.7 写一个本地 pdf 预览的接口

    依赖方面 创建的是 接口web项目就好了 然后包管理工具打开需要这些 然后 例如这里我要预览 本地 E盘下的 ydzxmgf下的git分支管理规范.pdf文件 就可以这样写 然后在浏览器上访问接口 就达到这个预览的效果了

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包