pdf:

目前开源、成熟、稳定的第三方包只有iText。而用iText生成PDF有三种方式:

  1. 调用iText API,用代码“写”出PDF,依赖包:com.itextpdf:itextpdf:5.5.11
  2. 结合XmlWorker,从HTML模板生成PDF,依赖包:com.itextpdf.tool:xmlworker:5.5.11
  3. 结合Flying Saucer,从HTML模板生成PDF,依赖包:org.xhtmlrenderer:flying-saucer-pdf-itext5:9.1.6

这一段是复制别人的,我使用的是第二种方法,直接html转pdf,这种方式只要用对了就特别方便,如果用代码写出pdf,那得上千行java代码了,非常麻烦

开始配置:

网上查找了很久,发现下面这个链接帮我避免了很多坑,这些依赖组合好就能正常使用了

http://www.zhimengzhe.com/HTMLjiaocheng/259505.html

所需依赖:

注意:一定要按此版本号引入,不然会出现很多错误,包括“中文乱码、中文不输出或直接报错”等异常!

        <dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.1</version>
</dependency>

依赖好了之后,又搜了很久,找到了支持中文的解决方案:

最简单 iText 的 PDF 生成方案(含中文解决方案)HTML 转为 PDF  (下面的这个方法的总结参考自此链接)

要点:

所有的单标签必须闭合(所有单标签必须全部闭合,否则只要有一个没闭合,都会报错 RuntimeWorkerException,

例如: com.itextpdf.tool.xml.exceptions.RuntimeWorkerException: Invalid nested tag head found, expected closing tag meta.  注:这里的报错不会给出源文件中出错位置的行数,但是它会给出报错的标签,这里给出的是meta没有正确被关闭,事实上,这里给出的报错已经很详细了,在head里找到了无效嵌套,预期的结束了meta标签,也就是说meta没闭合,如果是成对标签少了闭合标签也会抛出异常,或者单标签未闭合,也会抛出异常,所以其实还是比较好找的,但是写的时候一开始就得注意好标签的闭合问题

另一个要点:如果在文本或者非标签的地方使用了 < > 这样的特殊字符,必须写成实体字符,否则程序在转pdf的时候会当成正常标签处理,导致异常关闭标签,就报错了

,成对标签正常写即可,支持一些基本的html、css,不支持外部link script,不支持js,body以外必须全部按照下面的格式来写,body以内的,注意每个span都必须配上字体的样式,否则不能显示pdf中文文本

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body screen_capture_injected="true" ryt11773="1">
<p>
<span style="font-size:12.0pt; font-family:MS Mincho">長空</span> <span
style="font-size:12.0pt; font-family:Times New Roman,serif">(Broken
Sword),</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王殘劍</span>
<span style="font-size:12.0pt; font-family:Times New Roman,serif">(Flying
Snow),</span> <span style="font-size:12.0pt; font-family:MS Mincho">飛雪</span>
<span style="font-size:12.0pt; font-family:Times New Roman,serif">(Moon),
</span> <span style="font-size:12.0pt; font-family:MS Mincho">如月</span> <span
style="font-size:12.0pt; font-family:Times New Roman,serif">(the
King), and</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王</span>
<span style="font-size:12.0pt; font-family:Times New Roman,serif">(Sky).</span>
</p>
</body>
</html>

再使用java转换代码进行转换即可:

package com.zhouqian.itext;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset; import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper; public class D07_ParseHtmlAsian { public static final String HTML = "E:/Dropbox/document/java/designPattern/data/hero.html";
public static final String DEST = "E:/Dropbox/document/java/designPattern/data/hero.pdf"; /**
* Creates a PDF with the words "Hello World"
* @param file
* @throws IOException
* @throws DocumentException
*/
public void createPdf(String file) throws IOException, DocumentException {
// step 1
Document document = new Document();
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
// step 3
document.open();
// step 4
XMLWorkerHelper.getInstance().parseXHtml(writer, document,
new FileInputStream(HTML), Charset.forName("UTF-8"));
// step 5
document.close();
} /**
* Main method
*/
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new D07_ParseHtmlAsian().createPdf(DEST);
}
}

在指定路径下就可以得到 PDF 结果:

我测试之后发现能够正常使用,nice

PDF中放入统计图:

需要用到 jfreechart 来生成图,然后再把图片引入html,再转pdf

https://www.yiibai.com/jfreechart

发现这个易百教程上面的java教程很全面,基本上涵盖了java的各类技术和组件,都是一些生产上使用广泛的组件技术,可以用来实现各种需求

Excel:

excel的话,使用poi+模板的方式就可以了

报表生成思路:

pdf:先写一个基本的符合pdf生成标准(要点:所有的单标签必须闭合,成对标签正常些即可,支持一些基本的html、css,不支持外部link script,不支持js,body以外必须全部按照下面的格式来写,body以内的,注意每个span都必须配上字体的样式,否则不能显示pdf中文文本)的html,然后用jsp的方式在特定位置填充数据,想要生成pdf的时候,让程序自己去访问刚才的jsp页面(直接让程序访问localhost的页面位置进行下载即可,使用http/https通道访问),访问得到的就是已经填充好数据的html了,然后下载,文件名生成时规定成.html格式的,然后再用上面的html转pdf即可得到pdf了。

(待续)

 

javaweb 报表生成(pdf excel)所需要用到的技术和思路的更多相关文章

  1. Jacob工具类使用文件互转服务 word转html html转excel word转pdf excel转pdf ppt转pdf

    前提条件  必须安装MS office 1.jdk使用jdk1.8 2.jacob.dll放在..\jdk1.8\jre\bin目录下 3.eclipse的jre版本要和jdk一致,window-&g ...

  2. 前端vue项目-关于下载文件pdf/excel(三)

    最近在做一些需求,需要下载一些文件信息,最频繁的就是下载excel文件到本地了 看过了很多方法,做个整理吧哈哈哈哈 参考的文章链接: https://www.cnblogs.com/jiangweic ...

  3. .net mvc使用FlexPaper插件实现在线预览PDF,EXCEL,WORD的方法

    FlexPaper插件可以实现在浏览器中在线预览pdf,word,excel等. 在网上看到很多关于这个插件实现预览的技术,但是很难做到word和excel在线预览. pdf很好实现. 首先下载相关的 ...

  4. JavaWeb动态导出Excel可弹出下载

    由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载.项目使用的Spring+Mybatis+SpringMVC框架,利用Apache POI导出Excel.POI具体使用请自行百度 ...

  5. JAVA实现word doc docx pdf excel的在线浏览 - 仿百度文库 源码

    我们具体实现思路是这样的 首先下载并安装openoffice和swftools openoffice下载地址:http://www.openoffice.org/download/index.html ...

  6. 【JavaWeb】导入Excel并进行校验

    一.需要实现的目标 1.界面编写 2.导入表读取表名,进行校验,后台匹配(判断此表的名称是否能够模糊匹配上) 3.确定表存在,读取其中的数据,暂存 4.正则表达式数据校验(判断是否已存在,数据是否符合 ...

  7. javaWeb学习总结(7)-会话之session技术

    什么是Session 使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度. Session技 ...

  8. javaWeb学习总结(6)- 会话之cookie技术

    什么是会话? 在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话. 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为 ...

  9. JavaWeb -学生信息管理实践(JDBC+web+三层架构+DBUtil构造思路)

    前言: 1 该程序使用动态web项目 2 该程序使用SQL server需导入对应包( 具体可看前篇----JDBC的使用) 3 三层架构思想: ①表示层 前台:jsp/html等 作为前台与用户交互 ...

随机推荐

  1. 工具-github在linux下面没有git push报错

    time: 2015/12/25 1. 描述: error: The requested URL returned error: 403 Forbidden while accessing https ...

  2. 关于RSA、公钥、私钥、加密、签名的那些概念

    前言 作为一名程序员,经常会听到加密解密之类的词.而非对称加密技术,应用的非常广泛.本文不写加密技术的原理,只是希望以一个简单的类比,让大家了解非对称加密中常见词的概念,以及它的作用. 介绍 在RSA ...

  3. "函中函" -------------------- func2(func) -------------- 函数名可以当做函数的参数

    def func(): print("吃了么")def func2(fn): print("我是func2") fn() # 执⾏传递过来的fn # 即 fn替 ...

  4. UserUI程序详解

    重要内容放前面:https://blog.csdn.net/yizhou2010/article/details/52837944 作者可关注 1.进行初始化,会用到AfxWinmain函数:创建当前 ...

  5. 【转载】Java 集合框架

    http://wangkuiwu.github.io/2012/02/03/collection-03-arraylist/ 网上比较全的Java集合框架教程. 注:transient是Java语言的 ...

  6. Avito Code Challenge 2018

    第一次打CF,很菜,A了三道水题,第四题好像是是数位DP,直接放弃了.rateing从初始的1500变成了1499,还是绿名,这就很尴尬.之后觉得后面的题目也没有想象的那么难(看通过人数)过两天吧剩下 ...

  7. 【洛谷】【搜索(dfs)】P1363 幻想迷宫

    [题目描述:] 幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成.矩阵中有的地方是道路,用'.'表示:有的地方是墙,用'#'表示.LHX和WD所在的位置用'S'表示.也就是对于迷宫中的一 ...

  8. 【转】 Class.forName()用法及与new区别 详解

    平时开发中我们经常会发现:用到Class.forName()方法.为什么要用呢? 下面分析一下: 主要功能Class.forName(xxx.xx.xx)返回的是一个类Class.forName(xx ...

  9. HBase学习之路 (三)HBase集群Shell操作

    进入HBase命令行 在你安装的随意台服务器节点上,执行命令:hbase shell,会进入到你的 hbase shell 客 户端 [hadoop@hadoop1 ~]$ hbase shell S ...

  10. jQuery页面滚动数字增长插件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...