SpringBoot pdf打印及预览(openhtmltopdf+freemarker)

Posted 多喝灬丶烫水博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot pdf打印及预览(openhtmltopdf+freemarker)相关的知识,希望对你有一定的参考价值。

SpringBoot pdf打印及预览(openhtmltopdf+freemarker)

  1. 添加依赖

openhtmltopdf+freemarker

  <properties>
        <openhtml.version>1.0.10</openhtml.version>
    </properties>
<!--openhtmltopdf -->
   <dependencies>
        <dependency>
            <!-- ALWAYS required, usually included transitively. -->
            <groupId>com.openhtmltopdf</groupId>
            <artifactId>openhtmltopdf-core</artifactId>
            <version>$openhtml.version</version>
        </dependency>
        <dependency>
            <!-- Required for PDF output. -->
            <groupId>com.openhtmltopdf</groupId>
            <artifactId>openhtmltopdf-pdfbox</artifactId>
            <version>$openhtml.version</version>
        </dependency>
        <dependency>
            <!-- Optional, leave out if you do not need logging via slf4j. -->
            <groupId>com.openhtmltopdf</groupId>
            <artifactId>openhtmltopdf-slf4j</artifactId>
            <version>$openhtml.version</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
  </dependencies>
  1. 在/resources/template/view/html新建模板xxx.ftl文件
<html>
<head>
    <meta charset="UTF-8"/>
    <style>
    /* 特有css样式自行参考官网 */
        @page 
            size: a4;
            @top-left 
                content: element(header-left);
            
            @top-center 
                content: element(header-center);
            
            @top-right 
                content: element(header-right);
            
            @bottom-center 
                font-size: 14px;
                content: counter(page);
                font-family: \'simsun\', serif;
            
            margin: 50px;
        

        * 
            margin: 0;
            padding: 0;
            font-family: \'simsun\', serif;
        

        #page-header-left 
            font-size: 10px;
            font-weight: bold;
            position: running(header-left);
        

        #page-header-center 
            font-size: 10px;
            font-weight: bold;
            position: running(header-center);
        

        #page-header-right 
            font-size: 10px;
            font-weight: bold;
            position: running(header-right);
        

        table 
            width: 100%;
            font-size: 14px;
            border-collapse: collapse;
            font-family: \'simsun\', serif;
            border-spacing: 0;
            /* The magical table pagination property. */
            /*-fs-table-paginate: paginate;*/
            /* Recommended to avoid leaving thead on a page by itself. */
            -fs-page-break-min-height: 0.5cm;
            border-left: 0.07cm solid black;
            border-right: 0.07cm solid black;
            border-bottom: 0.03cm solid black;
        

        .checkbox 
            display: inline-block;
            position: relative;
            top: 1px;
            width: 10px;
            height: 10px;
            border: 1px solid black;

        

        .correct 
            display: inline-block;
            position: relative;
            top: 2px;
            right: 15px;
            width: 7px;
            height: 3px;
            border-left: 1px solid black;
            border-bottom: 1px solid black;
            -webkit-transform: rotate(-45deg);
            transform: rotate(-45deg);
            margin-right: -16px;
        

        input[type = "checkbox"] 
            width: 10px;
            height: 10px;
            border: 1px solid black;
        

        tr, thead, tfoot 
            page-break-inside: avoid;
        

        td, th 
            page-break-inside: avoid;
            font-family: \'simsun\', serif;
            padding: 1px;
            border-top: 0.03cm solid black;
            border-left: 0.03cm solid black;
        


        td:first-child, th:first-child 
            border-left: 0;
        

        #table-title 
            text-align: center;
            margin-top: 0;
            margin-bottom: 5px;
            font-weight: bold;
          
       
    </style>
</head>
<body>
<div class="header-box">
    <div id="page-header-left">
        <span id="page-header-text">编号:<span >$code!\'\'</span></span>
    </div>
    <div id="page-header-center">
    <span id="page-header-text">时间 <sup>1)</sup>:<span
                >$time?date!\'\'</span></span>
    </div>
</div>
<div class="basic-box">
    <table >
        <tr>
            <td>标题1</td>
            <td>$xx1!\'\'</td>
            <td>标题2</td>
            <td>$xx2!\'\'</td>
            <td>标题3</td>
            <td>$xx3!\'\'</td>
        </tr>
         <tr>
            <td >结果</td>
            <td colspan="3" >
                <div>
                    <div class="checkbox"></div>
                    <#if result??&&result == \'1\'>
                        <div class="correct"></div>
                    </#if>
                    <div >合格</div>
                    <div class="checkbox"></div>
                    <#if result??&&result == \'0\'>
                        <div class="correct"></div>
                    </#if>
                    <div >不合格</div>
                </div>
            </td>
            <td colspan="4" >签字人:</td>
        </tr>
    </table>
</div>



</body>
</html>
  1. controller接口
   @RequestMapping(value = "/print/pdf/code", produces = MediaType.APPLICATION_PDF_VALUE)
    public ResponseEntity<byte[]> printPdf(@PathVariable("code") String detectCode) throws IOException, TemplateException 
        Assert.hasText(code, "code不能为空");
        return detectReportPrintService.findPdf(code);
    
  1. service实现类

vue-pdf插件实现pdf上传预览下载预览打印下载

[vue-pdf] npm连接:https://www.npmjs.com/package/vue-pdf

安装vue-pdf

npm i vue-pdf

1.解决字体问题

  将node_modules/pdfjs-dist/cmaps文件夹复制到public文件夹下 (找不到的可以看下代码怎么写的,node_modules/vue-pdf/src/CMapReaderFactory.js)

2.上传预览

<template>
  <div>
    <el-upload
      class="upload-demo" drag action="#" 
      :auto-upload="false"
      :on-change=\'fileChange\'
      :limit=\'1\'
      multiple>
      <i class="el-icon-upload"></i>
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
      <div class="el-upload__tip" slot="tip">
        只能上传jpg/png文件,且不超过500kb
      </div>
    </el-upload>
    <pdf  :src="pdfURL"></pdf>
  </div>
</template>
<script>
import pdf from "vue-pdf";
export default {
  components: {
    pdf,
  },
  data() {
    return {
      pdfURL: "",
    };
  },
  methods: {
    fileChange(file){
    //拿到上传的文件
      let file=file.raw
    //转成二进制
      let blob=new Blob([file])
    //本地创建新的连接地址
      this.pdfURL=URL.createObjectURL(blob)
    //解决字体问题、第二次加载字体不显示问题
      this.pdfURL= pdf.createLoadingTask({
      url: this.pdfURL ,
      cMapUrl: \'/cmaps/\',
      cMapPacked: true})
    }
  },
};
</script>

2. 下载预览

3.打印

4.下载

 

有空更新

 

以上是关于SpringBoot pdf打印及预览(openhtmltopdf+freemarker)的主要内容,如果未能解决你的问题,请参考以下文章

vue-pdf插件实现pdf上传预览下载预览打印下载

获取打印预览并将其保存为 PDF 文件

从 javascript 触发 base64 编码 PDF 的打印预览

访问报告打印输出(或 PDF)缺少打印预览中可见的信息

在实际打印文档之前预览PDF文件并选择打印机

使用Iframe打印预览pdf,兼容谷歌火狐浏览器