将数据生成带图表的pdf,并下载

1 需求

在web开发中经常遇到一些报表数据的在线预览和下载,在我之前一篇文章中说过几种实现的方式,可以根据自己的需求采用合适自己的方案。

2 基本实现流程

我在线预览和下载都是采用的pdf格式,其实就是考虑生成pdf的模板,然后向其中添加数据。但是,操作pdf比较死板,不灵活。于是考虑先生成html,再将html转换成pdf。如下实现逻辑------

1.将word样式转换成html。

2将html用freemaker生成动态模板。

以上两步其实你可以手写,但是我懒。。。。。

3.调用模板,赋值,生成静态的html

4.将html生成pdf文件

3详细实现

首先产品给了一份word作为pdf的输出格式

就是这种文字加图表的一个样式 。

将word转换成html代码

网站地址  http://kindeditor.net/demo.php

看图。。。

将代码放入freeMarker 的模板,ftl文件中

不会的百度一下,用法很简单。。

https://blog.csdn.net/yuhaifei_123/article/details/79380725

将刚刚的html代码放入 ftl的body中。

那个代码中改一下字体为 font-family:SimSun,不要有空格 

记住:body最好指定字体,不然后面可能有坑

<body style="font-size:12px; font-family:SimSun">

ftl插件在eclipse中安装

https://blog.csdn.net/menglele1314/article/details/47310861

Freemarker  生成静态html的方法,包看下面的pom文件

package com.jf.imgPdf;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * @Description
 * @Author zengzhiqiang
 * @Date 2018年8月29日
 */

public class Freemarker {

    public static void main(String[] args) throws IOException, TemplateException {
    // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
    Configuration configuration = new Configuration(Configuration.getVersion());
    // 第二步:设置模板文件所在的路径。
    configuration.setDirectoryForTemplateLoading(new File("D://workspace//mavenLogin//src//main//java//com//jf//imgPdf"));
    // 第三步:设置模板文件使用的字符集。一般就是utf-8.

    configuration.setDefaultEncoding("utf-8");
    // 第四步:加载一个模板,创建一个模板对象。
    Template template = configuration.getTemplate("hello.ftl");
    // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
    Map dataModel = new HashMap<>();
    //向数据集中添加数据
    dataModel.put("title", "课堂秩序");
    // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
    Writer out = new FileWriter(new File("D://workspace//mavenLogin//src//main//java//com//jf//imgPdf//hello.html"));
    // 第七步:调用模板对象的process方法输出文件。
    template.process(dataModel, out);
    // 第八步:关闭流。
    out.close();
    System.out.println("ok......");
}
}

hello。ftl 模板

<!DOCTYPE html>
<html>
    <head>
    <meta charset="utf-8"></meta>
        <title>课堂质量模板</title>      
    </head >
    <body style="font-size:12px; font-family:SimSun">
  <p class="MsoNormal" style="text-align:center;" align="center">
    <b><span style="font-size:15.0pt;">2018</span></b><b><span style="font-size:15.0pt;font-family:&quot;">年</span></b><b><span style="font-size:15.0pt;">8</span></b><b><span style="font-size:15.0pt;font-family:&quot;">月</span></b><b><span style="font-size:15.0pt;">13</span></b><b><span style="font-size:15.0pt;font-family:&quot;">日日报</span></b><b><span style="font-size:15.0pt;"></span></b>
</p>
<p class="MsoListParagraph" style="margin-left:42.0pt;text-indent:-21.0pt;">
    <span style="font-size:15.0pt;font-family:Wingdings;"><span><span></span></span></span><b><span style="font-size:15.0pt;font-family:&quot;">${title}</span></b><b><span style="font-size:15.0pt;"></span></b>
</p>
<h2>
    <span style="font-family:SimSun;">一、总体情况</span>
</h2>
<p class="MsoNormal" style="text-indent:27.5pt;">
    <span style="font-family:&quot;">今日课堂总数</span><span>100</span><span style="font-family:&quot;">节课,发生异常课堂数</span><span>50</span><span style="font-family:&quot;">节课,违纪次数</span><span>50</span><span style="font-family:&quot;">次,违纪扣分</span><span>100</span><span style="font-family:&quot;">分。</span>
</p>
<h2>
    <span style="font-family:SimSun;">二、详细情况</span>
</h2>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span style="font-family:&quot;">今日教师违纪扣分前</span><span>5</span><span style="font-family:&quot;">名:</span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span><img src="./order_1.png" width="482" height="289" /></span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span style="font-family:&quot;">今日学生违纪扣分前</span><span>5</span><span style="font-family:&quot;">名:</span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span><img src="./order_2.png" width="482" height="289" /></span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span style="font-family:&quot;">今日教师各违纪类型发生次数详情:</span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span><img src="./order_3.png" width="482" height="289" /></span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span style="font-family:&quot;">今日学生各违纪类型发生次数详情:</span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span><img src="./order_4.png" width="482" height="289" /></span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span> </span>
</p>
<h2>
    <span style="font-family:SimSun;">三、总结</span>
</h2>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span>1. </span><span style="font-family:&quot;">今日违纪扣分最多的是英语学院的<span style="color:red;">张老师</span>,违纪为上课接打电话、上课睡觉</span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span>2. </span><span style="font-family:&quot;">今日违纪扣分最多的是<span style="color:red;">英语学院</span>,违纪为上课打架、上课睡觉</span>
</p>
<p class="MsoNormal" style="text-indent:33.0pt;">
    <span>3. </span><span style="font-family:&quot;">今日教师各违纪类型中,发生次数最多的是<span style="color:red;">上课接打电话</span>;学生各违纪类型中,发生次数最多的是<span style="color:red;">上课接打电话</span></span><span style="color:red;"> <span></span></span>
</p>
<br />
    </body>

</html>

 运行之后就会生成静态的html

html转换成pdf,先映入包 pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jf</groupId>
  <artifactId>mavenLogin</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mavenLogin</name>
  <url>http://maven.apache.org</url>
 
 
      <!-- 定义SpringBoot的版本 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
    </parent>
    

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    
    <!-- SpringBoot web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.0</version>
    </dependency>
    
    <!-- 映入itex java操作pdf -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.4.1</version>
    </dependency>
    
    
    <dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf</artifactId>
    <version>9.0.0</version>
</dependency>


    <dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>2.1.7</version>
    </dependency>  

<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>core-renderer</artifactId>
    <version>R8</version>
</dependency>

<dependency>  
    <groupId>jtidy</groupId>  
    <artifactId>jtidy</artifactId>  
    <version>4aug2000r7-dev</version>  
    <type>jar</type>  
    <scope>compile</scope>  
</dependency>  
<dependency>  
    <groupId>net.sf.barcode4j</groupId>  
    <artifactId>barcode4j-light</artifactId>  
    <version>2.0</version>  
</dependency>  
<dependency>  
    <groupId>avalon-framework</groupId>  
    <artifactId>avalon-framework-impl</artifactId>  
    <version>4.2.0</version>  
</dependency>  
<!-- pdf -->

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>


              
       
  </dependencies>
</project>

 freemaker的包也在

hrml转pdf

package com.jf.itext;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.itextpdf.text.pdf.BaseFont;

/**
 * @Description
 * @Author zengzhiqiang
 * @Date 2018年8月24日
 */

public class PDFCC {
    
    public void createPdf() throws Exception {  
    // step 1  
    String inputFile ="D://workspace//mavenLogin//src//main//java//com//jf//itext//DAY_REPORT.html";  
    String url = new File(inputFile).toURI().toURL().toString();  
    String outputFile = "D://workspace//mavenLogin//src//main//java//com//jf//itext//dada.pdf";  
    System.out.println(url);  
    // step 2  
    OutputStream os = new FileOutputStream(outputFile);  
    ITextRenderer renderer = new ITextRenderer();  
    renderer.setDocument(url);  

    // step 3 解决中文支持  
    ITextFontResolver fontResolver = renderer  
            .getFontResolver();  
    fontResolver.addFont("c:/Windows/Fonts/Simsun.ttc", BaseFont.IDENTITY_H,     
            BaseFont.NOT_EMBEDDED);  

    renderer.layout();  
    renderer.createPDF(os);  
    os.close();  
      
    System.out.println("create pdf done!!");  
}  
      

public static void main(String[] args) throws Exception {  
    
    PDFCC app = new PDFCC();  
    
    app.createPdf();  
}

}

这样就生成了pdf

 遇到转换失败,就是html格式的问题

下一篇我会介绍,pdf中那个柱状图是怎么通过后台生成的

银色手链 ---------记录

猜你喜欢

转载自blog.csdn.net/zzqtty/article/details/82589748