springboot实现pdf打印和预览

在你看下面文章的时候,强烈建议看下:
关于使用iText库创建PDF文件详细说明:https://www.cnblogs.com/chenpi/p/5534595.html
作为学习,当然希望免费的可以利用一下就好。
推荐:(如果你有钱,还是可以卖一年的,也不是很贵)
在这里插入图片描述
首先我们制作需要的excel或者word模板,另存为pdf,利用软件进行编辑。
在这里插入图片描述
我们将上面的PDF利用软件编辑。
加水印等等结果如下:
在这里插入图片描述
接下来制作表单:
在这里插入图片描述
在这里插入图片描述
接下来为每一个需要填的内容添加文本域。
在这里插入图片描述
导包:

<!-- pdf实现 -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.13</version>
    </dependency>

    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.5.13</version>
    </dependency>

程序:
pdf封装实体:

package com.poi.testpoi.pojo;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@Data
@Getter
@Setter
public class PdfEntity {

private String dogNo;

private String name;

private Integer age;

private Integer dogYear;

private String brithday;

private String reason;

private String remark;

private String level;

private String ability;

private String summary;
}

控制层:

package com.poi.testpoi.controller;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.poi.testpoi.pojo.PdfEntity;

@Controller
public class PDFController {

@RequestMapping("/createPDF")
@ResponseBody
public String  createPDF(HttpServletResponse response) throws DocumentException {
    
    // 模板路径 关于路径最好放在配置文件中,我这里只想说明问题
    String templatePath = "C:\\Users\\zy962\\Desktop\\temp.pdf";
    // 生成文件路径
    String filename = "testpdf.pdf";
    
    // 创建对象
    PdfEntity entity = new PdfEntity();
    entity.setDogNo("NO123456");
    entity.setName("周毅");
    entity.setAge(26);
    entity.setDogYear(4);
    entity.setBrithday("93.11.18");
    entity.setReason("已经失去了追人的能力。陷入了一个死循环:我主动找她吧,要是对我没感觉,找了不理我怎么办?于是还没尝试,就不去招惹别人了。");
    entity.setRemark("并不是每一个单身的人,都代表可撩的状态,有的人早已经对恋爱不抱什么希望。只想好好学习,好好工作,然后发财。");
    entity.setLevel("到了我这种境界后,就可以和寂寞和睦相处。若有了独自活下去的觉悟,慢慢变老也会充满乐趣。");
    entity.setAbility("非常羡慕那些能一喜欢/一追就是几年的人,这种恒心,在他来说,一个月、不一个周都做不到,两天应该也许大概能做到。");
    entity.setSummary("综上结论,面向对象是不存在的,面向过程是不存在的,汪汪汪一只。");
    
    Map<String, Object> datas = new HashMap<String, Object>();
    datas.put("name", entity.getName());
    datas.put("dogNo", entity.getDogNo());
    datas.put("age", entity.getAge());
    datas.put("dogYear", entity.getDogYear());
    datas.put("brithday", entity.getBrithday());
    datas.put("reason", entity.getReason());
    datas.put("remark", entity.getRemark());
    datas.put("level", entity.getLevel());
    datas.put("ability", entity.getAbility());
    datas.put("summary", entity.getSummary());
    
    PdfReader reader;
    OutputStream os = null;
    ByteArrayOutputStream baos = null;
    PdfStamper stamper;
    
    try {
        os = response.getOutputStream();
        // 读入pdf表单
        reader = new PdfReader(templatePath);
        baos = new ByteArrayOutputStream();
        // 根据表单生成一个新的pdf
        stamper = new PdfStamper(reader, baos);
        // 获取pdf表单
        AcroFields formTexts = stamper.getAcroFields();
        
        // 设置字体(这里设置为系统字体,你也可以引入其他的字体),不设置很可能,中文无法显示。
        BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",
                BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        formTexts.addSubstitutionFont(bf);
        
        // 数据查询后,值的植入 强烈推荐键值方式,其他方式很容易混
        Set<String> keySet =  datas.keySet();
        for (String key : keySet) {
            formTexts.setField(key, datas.get(key).toString());
        }
        
        stamper.setFormFlattening(true); // 这个必须设
        stamper.close();
        
        // 创建一个pdf实例
        Document document = new Document();
        PdfCopy copy = new PdfCopy(document, os);
        document.open();
        PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(baos.toByteArray()), 1);
        copy.addPage(importedPage);
        document.close(); // open和close一套
        
        // 强制下载
        //response.reset();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;fileName="
                + URLEncoder.encode(filename, "UTF-8"));

    } catch (IOException e) {
        e.printStackTrace();
    } finally { // 最后一定要关闭流
        try {
            baos.close();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return "成功,请去查看";
}
}

运行结果:
在这里插入图片描述
我们发现内容并没有显示全,经过调查,Java内部是不能实现的。只能在制作pdf表单的时候设置。设置为多行即可。
在这里插入图片描述
我们更改后:
在这里插入图片描述
如果有更复杂的实现:再次建议参考:https://www.cnblogs.com/chenpi/p/5534595.html。写的非常的全。

还有就是这种设置具体位置也有可能会用到的。

		// 通过域名获取所在页和坐标,左下角为起点
        String imgpath="e:/aa.png";
        int pageNo = form.getFieldPositions("img").get(0).page;
        Rectangle signRect = form.getFieldPositions("img").get(0).position;
        float x = signRect.getLeft();
        float y = signRect.getBottom();
        // 读图片
        Image image = Image.getInstance(imgpath);
        // 获取操作的页面
        PdfContentByte under = ps.getOverContent(pageNo);
        // 根据域的大小缩放图片
        image.scaleToFit(signRect.getWidth(), signRect.getHeight());
        // 添加图片
        image.setAbsolutePosition(x, y);
        under.addImage(image);                 

版权声明:本文为weixin_42603009原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。