springboot实现pdf打印和预览

    xiaoxiao2025-06-18  8

    在你看下面文章的时候,强烈建议看下: 关于使用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);
    最新回复(0)