在线打印excel

132 阅读2分钟

pom.xml文件

 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker -->
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>

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

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.6</version>
        </dependency>

        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>1.4.01</version>
        </dependency>

application.yml

HTML: freemarker.ftl
FONT: simhei.ttf
HTML1: freemarker1.ftl

simhei.ttf

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Beatae enim fuga laboriosam modi nulla, officiis quaerat sapiente totam vitae. Ab accusamus ad amet atque corporis dolor dolorem doloremque dolorum eius id illum laboriosam magnam, necessitatibus neque nesciunt nulla numquam, obcaecati officiis placeat qui quis quisquam quo recusandae reprehenderit suscipit ut.

freemarker1.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
    <style>
        body {
            font-family: SimHei;
        }
        .pos {
            position: absolute;
            left: 100px;
            top: 150px
        }
        #table {
            font-size:12px;
            border-collapse: collapse;
        }
        tr, td {
            border: 1px solid #666666;
            padding: 8px;
        }
    </style>
</head>
<body>
<div class="blue pos">
    <h1>肇事肇祸精神病人基础信息数据</h1>

    <table id="table">
        ${valueList}
    </table>


</div>
</body>
</html>

controller

@GetMapping(value = "/printData")
    @ApiOperation("快速查询-基础信息打印数据")
    public void showPdf(HttpServletResponse response,ExamineQueryVO examineQueryVO) throws IOException, DocumentException, TemplateException, com.lowagie.text.DocumentException {
        //需要填充的数据
        Map<String, Object> data = new HashMap<>(16);
        List<ExamineQueryVO> ab = causeTroubleMapperExt.getExamineQueryVOList(examineQueryVO);
        String valueList ="";
        valueList="<tr><td>姓名</td><td>身份证</td><td>来源</td><td>危险等级</td><td>现实状态</td><td>状态</td></tr>";

        for(ExamineQueryVO abe :ab){
            valueList +=" <tr>";
            valueList +=" <td>"+abe.getEssName()+"</td>";
            valueList +=" <td>"+abe.getCardCode()+"</td>";
            valueList +=" <td>"+abe.getCompanyName()+"</td>";
            valueList +=" <td>"+abe.getDangerLevelName()+"</td>";
            valueList +=" <td>"+abe.getActualityStateName()+"</td>";
            valueList +=" <td>"+abe.getExamineStateName()+"</td>";
            valueList +="</tr>";
        }

        data.put("valueList", valueList);
        String content = freeMarkerRender(data, html);
        response.reset();
        response.setContentType("application/pdf");
        response.addHeader("Content-Disposition", "inline;filename=" + new String("filename.pdf".getBytes("gbk"), "utf-8"));
        //创建pdf
        ServletOutputStream out = response.getOutputStream();
        createPdf(content, out);
        out.flush();
    }

    public void createPdf(String content, OutputStream dest) throws IOException, com.lowagie.text.DocumentException {
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        fontResolver.addFont(font, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

        SharedContext sharedContext = renderer.getSharedContext();
        // 解决base64图片支持问题
        sharedContext.setReplacedElementFactory(new B64ImgReplacedElementFactory());
        sharedContext.getTextRenderer().setSmoothingThreshold(0);
        renderer.setDocumentFromString(content);
        renderer.layout();
        renderer.createPDF(dest);

    }
    /**
     * freemarker渲染html
     */
    public String freeMarkerRender(Map<String, Object> data, String htmlTmp) throws IOException, TemplateException {
        Writer out = new StringWriter();
        try {
            Template template = freemarkerConfig.getTemplate(htmlTmp);
            //将合并后的数据和模板写入到流中,这里使用的字符流
            template.process(data, out);
            out.flush();
            System.out.println(out.toString());
            return out.toString();
        } finally {
            out.close();
        }
    }

B64ImgReplacedElementFactory 图片代码

import java.io.IOException ;
import org.w3c.dom.Element ;
import org.xhtmlrenderer.extend.FSImage ;
import org.xhtmlrenderer.extend.ReplacedElement ;
import org.xhtmlrenderer.extend.ReplacedElementFactory ;
import org.xhtmlrenderer.extend.UserAgentCallback ;
import org.xhtmlrenderer.layout.LayoutContext ;
import org.xhtmlrenderer.pdf.ITextFSImage ;
import org.xhtmlrenderer.pdf.ITextImageElement ;
import org.xhtmlrenderer.render.BlockBox ;
import org.xhtmlrenderer.simple.extend.FormSubmissionListener ;
import com.lowagie.text.BadElementException ;
import com.lowagie.text.Image ;
import com.lowagie.text.pdf.codec.Base64 ;



public class B64ImgReplacedElementFactory implements ReplacedElementFactory {

    /**
     * 实现createReplacedElement 替换html中的Img标签
     *
     * @param c 上下文
     * @param box 盒子
     * @param uac 回调
     * @param cssWidth css宽
     * @param cssHeight css高
     * @return ReplacedElement
     */
    public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, UserAgentCallback uac,
                                                 int cssWidth, int cssHeight) {
        Element e = box.getElement();
        if (e == null) {
            return null;
        }
        String nodeName = e.getNodeName();
        // 找到img标签
        if (nodeName.equals("img")) {
            String attribute = e.getAttribute("src");
            FSImage fsImage;
            try {
                // 生成itext图像
                fsImage = buildImage(attribute, uac);
            } catch (BadElementException e1) {
                fsImage = null;
            } catch (IOException e1) {
                fsImage = null;
            }
            if (fsImage != null) {
                // 对图像进行缩放
                if (cssWidth != -1 || cssHeight != -1) {
                    fsImage.scale(cssWidth, cssHeight);
                }
                return new ITextImageElement(fsImage);
            }
        }

        return null;
    }

    /**
     * 将base64编码解码并生成itext图像
     *
     * @param srcAttr 属性
     * @param uac 回调
     * @return FSImage
     * @throws IOException io异常
     * @throws BadElementException BadElementException
     */
    protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException,
            BadElementException {
        FSImage fsImage;
        if (srcAttr.startsWith("data:image/")) {
            String b64encoded = srcAttr.substring(srcAttr.indexOf("base64,") + "base64,".length(),
                    srcAttr.length());
            // 解码
            byte[] decodedBytes = Base64.decode(b64encoded);

            fsImage = new ITextFSImage(Image.getInstance(decodedBytes));
        } else {
            fsImage = uac.getImageResource(srcAttr).getImage();
        }
        return fsImage;
    }


    /**
     * 实现reset
     */
    public void reset() {
    }


    @Override
    public void remove(Element arg0) {}

    @Override
    public void setFormSubmissionListener(FormSubmissionListener arg0) {}
}