精华内容
下载资源
问答
  • Java后端pdf 文件生成和导出

    千次阅读 2019-03-14 16:21:02
    生成pdf有两种方法,如下: 1) 使用 wkhtmltox 工具 html 转 pdf 优点:一次安装,永久使用。便捷,生成效果好 缺点:并不是所有 html 都能成功转成 pdf,至于为什么需要深度研究研究。 安装 去官网下载:...

    1 pdf 文件生成

    生成pdf有两种方法,如下:
    1) 使用 wkhtmltox 工具将 html 转 pdf
    优点:一次安装,永久使用。便捷,生成效果好
    缺点:并不是所有 html 都能成功转成 pdf,至于为什么需要深度研究研究。

    安装
    去官网下载:https://wkhtmltopdf.org/downloads.html
    分 windows 环境 linux 环境,各自取用适合的包。
    

    在这里插入图片描述
    如果是 windows 环境,工具解压后打开 dos 窗口,cd 到工具 bin/ 目录下,执行:
    wkhtmltopdf https://wkhtmltopdf.org/downloads.html E:\dir\test.pdf
    命令说明: wkhtmltopdf 【html路径】【存储路径】
    存储路径一定是要先存在的,否则会报错,文件名是自定义的。

    生成效果如下:
    在这里插入图片描述
    如果是 linux 环境,以 CentOS7 系统为例。
    安装:rpm -ivh --nodeps wkhtmltox-0.12.5-1.centos7.x86_64.rpm
    加了 --nodeps 会将缺少的依赖一起安装。
    使用与在 windows 系统是一样的,它还有很多命令,需要的自己去研究啦~
    这个工具还可以将 html 转成图片,有兴趣的可以去试试。

    补充:
    当在 linux 环境上面将 html转换成 pdf 时,如果内容是中文,可能转出来的 pdf 里面存在空白,这可能是 linux 环境上缺乏中文字体导致的。需要将 windows 的宋字字体 simsun.ttc 拷贝到在/usr/share/fonts中,然后重新执行命令生成 pdf。simsun.ttc 一般在 C:\Windows\Fonts 目录下。

    2) itext 创建 pdf 文件
    优点:强大的 java 插件,可以自定义生成各种样式的 pdf 、word。
    缺点:需要自己使用代码进行内容填充,稍微复杂一点。

    生成 pdf 需要的 maven 依赖:

    		<!-- itext pdf相关 -->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.5.13</version>
            </dependency>
    
            <!-- itext asian 字体相关 -->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itext-asian</artifactId>
                <version>5.2.0</version>
            </dependency>
    

    生成 pdf 核心代码示例:

    Document document = new Document(PageSize.A4);
    
    // 新建一个pdf文件
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("E:\\test\\test.pdf"));
    document.open();
    
    // 中文字体,解决中文不能显示问题
    BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    
    // 红标题字体风格
    Font redTitleFont = new Font(bfChinese, 20, Font.BOLD, BaseColor.RED);
    // 红标题抬头
    Paragraph redTitle = new Paragraph(serviceConfig.getOrganization(), redTitleFont);
    redTitle.setAlignment(Element.ALIGN_CENTER); // 居中
    document.add(redTitle); // 文档中加入红标题字段
    
    //参数 1.线宽度 2.直线长度,是个百分百,0-100之间 3.直线颜色 4.直线位置 5.上下移动位置
    document.add(new LineSeparator(4f,100, BaseColor.RED, Element.ALIGN_CENTER,-15f)); // 画线
    document.add(new LineSeparator(1f,100, BaseColor.RED, Element.ALIGN_CENTER,-20f));
    
    // 标题字体风格
    Font titleFont = new Font(bfChinese, 15, Font.BOLD); 
    // 标题内容
    Paragraph title = new Paragraph("关于xx的分析报告", titleFont);
    title.setSpacingBefore(25); // 离上一段落(标题)空的行数
    title.setAlignment(Element.ALIGN_CENTER); // 设置标题格式对齐方式
    document.add(title); // // 文档中加入标题字段
    
    // 正文字体风格
    Font contextFont = new Font(bfChinese, 10, Font.NORMAL); 
    // 循环生成多个相同的表格
    for (Person person: persons) {
        Paragraph info = new Paragraph("工作人员" + count++, contextFont);
        info.setSpacingBefore(10); // 离上一段落(标题)空的行数
        document.add(info);
    
        // 两列的表
        PdfPTable table = new PdfPTable(2);
        table.setWidthPercentage(100); // 宽度100%填充
        table.setSpacingBefore(10f); // 前间距
        table.setSpacingAfter(10f); // 后间距
    
        List<PdfPRow> listRow = table.getRows();
    
        // 设置列宽比例 1:3
        float[] columnWidths = {1f, 3f};
        table.setWidths(columnWidths);
    
        // 第1行
        PdfPCell[] cells1 = new PdfPCell[2]; // 一行两格
        PdfPRow row1 = new PdfPRow(cells1);
        cells1[0] = new PdfPCell(new Paragraph("姓名", contextFont)); // 第一个单元格
        cells1[1] = new PdfPCell(new Paragraph(person.getName(), contextFont)); // 第二个单元格
    
        // 第2行
        PdfPCell[] cells2 = new PdfPCell[2];
        PdfPRow row2 = new PdfPRow(cells2);
        cells2[0] = new PdfPCell(new Paragraph("性别", contextFont)); //单元格内容
        cells2[1] = new PdfPCell(new Paragraph(person.getGender(), contextFont));
        
        // 第3行
        PdfPCell[] cells3 = new PdfPCell[2];
        PdfPRow row3 = new PdfPRow(cells3);
        cells3[0] = new PdfPCell(new Paragraph("图片", contextFont)); //单元格内容
        cells3[0].setHorizontalAlignment(Element.ALIGN_LEFT); // 水平居左
        cells3[0].setVerticalAlignment(Element.ALIGN_MIDDLE); // 垂直居中
    
        // 填充多个图片
        String[] paths = person.getImagePath().split(","); // 图片全路径以逗号分隔的
        int column = 4; // 1行展示图片的数量
        int row;
        if (paths.length % column == 0) {
            row = paths.length / column;
        } else {
            row = paths.length / column + 1;
        }
    
        PdfPTable picTable = new PdfPTable(column);
        picTable.setWidthPercentage(100); // 宽度100%填充
        List<PdfPRow> rows = picTable.getRows();
    
        int count = 0;
        for (int i = 0; i < row; i ++) {
            PdfPCell[] cells = new PdfPCell[column];
            PdfPRow newRow = new PdfPRow(cells);
            for (int j = 0; j < column; j ++) {
                if (count < paths.length) {
                    Image image = Image.getInstance(paths[count++]);
                    //设置图片的宽度和高度
                    image.scaleAbsolute(100, 100);
                    cells[j] = new PdfPCell(image);
                }
            }
            rows.add(newRow);
        }
        cells3[1] = new PdfPCell(picTable); // 图片组成的table加入到第三行的第二格中
        
        listRow.add(row1);
        listRow.add(row2);
        listRow.add(row3);
       
        // 把表格添加到文件中
        document.add(victimTable);
    }
    

    2 下载 pdf 文件
    【效果】打开浏览器发送 get 请求,浏览器自动下载。

    Controller层请求接口

    /**
     * 下载工具
     */
    @Resource
    private DownloadUtil downloadUtil;
    
    @GetMapping("/download")
    public void export(HttpServletRequest request, HttpServletResponse response) {
    	String filePath = "E:\test\";
    	String fileName = "test.pdf";
    	downloadUtil.downloadFile(filePath, fileName, request, response);
    }
    

    DownloadUtil.java

    package xxx.common.utils;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    
    /**
     * 下载工具类
     *
     * @author xianhuang
     * @date 2019/03/11 10:21
     * @since 1.0
     */
    @Component
    public class DownloadUtil {
    
        /**
         * 日志记录
         */
        private static final Logger LOGGER = LoggerFactory.getLogger(DownloadUtil.class);
    
        /**
         * 下载文件
         * @param filePath 文件所在目录全路径
         * @param fileName 文件全名,包括后缀
         * @param request http请求
         * @param response http返回
         * @throws IOException 异常
         */
        public void downloadFile(String filePath, String fileName, HttpServletRequest request,
                                 HttpServletResponse response) throws IOException {
            String fullPath = filePath + fileName;
    
            if (fullPath.contains("\\")) {
                fullPath.replaceAll("\\\\","\\\\\\\\");
            }
    
            File f = new File(fullPath);
            if (!f.exists()) {
                LOGGER.error("文件{}不存在", f.getName());
                return;
            }
    
            // 解决中文名称乱码问题
            final String userAgent = request.getHeader("USER-AGENT");
            if (userAgent.contains("MSIE")
                    || userAgent.contains("Trident")
                    || userAgent.contains("Edge")) { //IE浏览器
                fileName = URLEncoder.encode(fileName, "UTF-8");
            } else if (userAgent.contains("Mozilla")) { //google,火狐浏览器
                fileName = new String(fileName.getBytes(), "ISO8859-1");
            } else {
                fileName = URLEncoder.encode(fileName, "UTF-8"); //其他浏览器
            }
    
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attchement;filename=" + fileName );
    
            try (FileInputStream fileInputStream = new FileInputStream(fullPath)) {
                OutputStream outputStream = response.getOutputStream();
                byte[] b = new byte[1024];
                int j;
                while ((j = fileInputStream.read(b)) > 0) {
                    outputStream.write(b, 0, j);
                }
                outputStream.flush();
                outputStream.close();
            } catch (IOException e) {
                LOGGER.error(e.getMessage());
            }
        }
    }
    
    
    展开全文
  • 使用MicroProfile构建API后端(电子书) 该项目包括以下部分: 电子书-实际的PDF / HTML Asciidoc来源 bookstore-书中引用的一些服务器端Java代码 ... Maven在target/generated-docs/生成该书(PDFHTML
  • 2020-12-10

    2020-12-10 18:20:50
    使用Java将html页面转为pdf,可以使用多种方式实现 1、itext在java后端生成pdf 2、使用

    使用Java将html页面转为pdf,可以使用多种方式实现

    1、itext在java后端生成pdf

    2、使用

    展开全文
  • 这些东西对于我们学习和进步有着莫大的进步,所以我有了这个 Github 上非常棒的 Java 开源项目整理下来的想法。我会按照几个维度对项目进行分类,以便大家查阅。当然,如果你觉得不错的话,欢迎给本项目点个 Star...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • Java资源包01

    2016-08-31 09:16:25
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包101

    2016-07-13 10:11:08
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包2

    热门讨论 2013-06-28 09:17:39
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包3

    热门讨论 2013-06-28 09:20:52
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包5

    热门讨论 2013-06-28 09:38:46
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包4

    热门讨论 2013-06-28 09:26:54
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包8

    热门讨论 2013-06-28 09:55:26
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • Java编写的网页版魔方游戏 内容索引:JAVA源码,游戏娱乐,魔方,网页游戏 Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分...
  • java开源包9

    热门讨论 2013-06-28 09:58:55
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • java开源包7

    热门讨论 2013-06-28 09:52:16
    J2C Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...
  • php-5.4.5-Win32-VC9-x86

    2012-07-28 05:09:25
    它由一个非常单纯的只能理解很少数特殊宏的分析引擎和 一些用在主页后端通用的工具组成.如留言簿,计数器和其他一些东西.这个分析器在1995年年中被重写并被命名为 php/fi 第二版. fi来自 rasmus 写的另外一个包, 用于...
  • 成果包含文章、pdf附件和非pdf附件,并它们分别列出;一个成果如果包含一个pdf文件则直接打开,如果多于一个则打开列表,非pdf附件也是一样;文章采用富文本编辑器froala,支持图文word直接黏贴,自动上传图片;...
  • shortuuid:一个生成器库,用以生成简洁的,明白的,URL 安全的 UUID。 simplejson:Python 的 JSON 编码、解码器。 unidecode:Unicode 文本的 ASCII 转换形式 。 uniout:打印可读的字符,而不是转义的字符串。...
  • ghtoc Github地址(pyhon) 见toc.py,(python2.7,使用方法·:python toc.py MDFile,会生成一个.bak备份文件)【推荐这个可以用,也不用装其他工具】 gh-md-toc Github地址 git团队协作项目操作说明.md 放在...
  • Reason :跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。 ROOT :具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能...
  • ✅ RabiAPI:一个开箱即用的Java接口文档生成工具 - 更多介绍 2020年7月27号添加 Lenix(北京) - Github, 博客 ✅ PHP中文站:最专业的PHP资源网站:PHP教程, PHP中文手册, PHP开发工具, PHP框架文档大全!- ...
  • 使用reportlab生成PDF报表 使用ECharts生成前端图表 Day46 - 日志和调试工具栏 配置日志 配置Django-Debug-Toolbar 优化ORM代码 Day47 - 中间件的应用 什么是中间件 Django框架内置的中间件 自定义中间件...
  • 3.4.6 最终生成HTML代码 52 3.5 改进意见 52 第二部分 管理工具和用户操作界面 55 第4章 mysql、mysqladmin和mysqldump 56 4.1 mysql 56 4.1.1 启动mysql 57 4.1.2 mysql的命令行选项 58 4.1.3 交互式使用...
  • ZendFramework中文文档

    2011-03-22 10:11:12
    4.4. Zend_Cache后端 4.4.1. Zend_Cache_Backend_File 4.4.2. Zend_Cache_Backend_Sqlite 4.4.3. Zend_Cache_Backend_Memcached 4.4.4. Zend_Cache_Backend_Apc 4.4.5. Zend_Cache_Backend_ZendPlatform 5. ...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

java后端将html生成pdf

java 订阅