itextpdf通过pdf模板生成pdf文件,设置粗体字体

  • 1.创建pdf模板
  • 2.使用模板生成pdf
  • 3.itext自带的字体列表
  • 4.遇到的坑

1.创建pdf模板

  1. 可以使用PDFFescape网站来线上创建pdf模板,网页链接:https://www.pdfescape.com/windows/ 或者 https://www.pdfescape.com/open/

  2. 本地建好一个pdf模板,需要填充数据的地方空着,生成一个pdf文件,然后点击我下图框起来的地方上传pdf文件。

  3. 点击下图框起来对的地方,然后创建表单域,在需要填充文字的地方用鼠标拉一下就行了。
    就会出现这种样子的表单域

    可以右键编辑一下表单域的属性

    name是表单域的名称,这个可以编辑,而且要记下来,后面使用itextpdf填充表单域的时候需要用的这个。

  4. 编辑完成之后,可以点击左边的下载按钮,将编辑后的pdf文件下载下来。这样模板就完成了

2.使用模板生成pdf

  1. 导入依赖
 <!-- itext  --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.2</version></dependency><!--pdf itext 的jar依赖  --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
  1. 创建pdf文件代码
 @AutowiredResourceLoader resourceLoader;/*** 生成pdf* @param vo* @param templateName*/public void createDisplayCardPdf(Vo vo, String templateName) {try {// pdf模板所在路径,就是网站制作好后下载的pdf模板路径Resource resource = resourceLoader.getResource("classpath:template/" + templateName);PdfReader reader = new PdfReader(resource.getInputStream());ByteArrayOutputStream bos = new ByteArrayOutputStream();PdfStamper ps = new PdfStamper(reader, bos);AcroFields fields = ps.getAcroFields();//填充文本fillData(fields, vo);ps.setFormFlattening(false);//生成文件名String filename = "qrcode";//生成二维码图片文件File bufferedImage = QRCodeUtils.createQrCodeFile(vo.getUrl(), path, filename, 400, 400);try {//PDF附件加上二维码水印PdfUtils.setWatermarkForPDF(ps, bufferedImage, 654, 83, 135, 135);} catch (Exception e) {throw new RuntimeException("pdf文件生成失败");} finally {//删除文件if (bufferedImage != null) {bufferedImage.delete();}}ps.close();//生成pdf路径存放的路径OutputStream fos = new FileOutputStream("D:/111/result.pdf");fos.write(bos.toByteArray());fos.flush();fos.close();bos.close();} catch (Exception e) {throw new RuntimeException(e.getMessage());}}/*** 填充模板中的数据*/public void fillData(AcroFields fields, Vo vo) {try {// 为字段赋值,注意字段名称是区分大小写的//设置字体大小float bigFontSize = 22;float textFontSize = 17;//中文字体  微软雅黑加粗//注意:BaseFont无法加粗,想要使用粗体的话需要使用粗体的字体BaseFont fontBold = BaseFont.createFont("D:\\111\\wryhBold.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//这样用于解决使用自定义字体导致pdf文件大小变大fontBold.setSubset(true);//嵌入只使用的字体//carBrandAndModel是之前设置的表单域的name//设置这个表单域的字体fields.setFieldProperty("carBrandAndModel", "textfont", fontBold , null);//设置这个表单域的字体大小fields.setFieldProperty("carBrandAndModel", "textsize", bigFontSize, null);//设置这个表单域的字体颜色BaseColor baseColor = BaseColor.WHITE;fields.setFieldProperty("carBrandAndModel", "textcolor", baseColor, null);//给表单域填充文本(一定要放在最后,不然设置的样式不生效)fields.setField("carBrandAndModel", vo.getCarBrandAndModel());} catch (Exception e) {throw new RuntimeException(e.getMessage());}}
package com.yimai.common.utils;import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfStamper;import java.io.File;
import java.io.IOException;public class PdfUtils {/*** 为PDF附件添加图片* @param stamper pdf文件* @param imageFile 图片* @param x 坐标* @param y* @throws IOException* @throws DocumentException*/public static void setWatermarkForPDF(PdfStamper stamper, File imageFile,int x,int y,int width,int height)throws IOException, DocumentException {PdfContentByte waterMar;PdfGState gs = new PdfGState();long startTime = System.currentTimeMillis();waterMar = stamper.getOverContent(1);// 在内容上方加水印
//            waterMar = stamper.getUnderContent(1);//在内容下方加水印// 设置图片透明度为0.2fgs.setFillOpacity(1f);// 设置笔触字体不透明度为0.4f//gs.setStrokeOpacity(0.4f);// 开始水印处理waterMar.beginText();// 设置透明度waterMar.setGState(gs);// 设置水印字体参数及大小//waterMar.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 60);// 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度//waterMar.showTextAligned(Element.ALIGN_CENTER, "公司内部文件,请注意保密!",  500, 430, 45);// 设置水印颜色waterMar.setColorFill(BaseColor.GRAY);// 创建水印图片Image itextimage = getImage(imageFile);// 水印图片位置itextimage.setAbsolutePosition(x, y);// 边框固定itextimage.scaleToFit(200, 200);// 设置旋转弧度//image.setRotation(30);// 旋转 弧度// 设置旋转角度//image.setRotationDegrees(45);// 旋转 角度// 设置等比缩放//itextimage.scalePercent(90);// 自定义大小itextimage.scaleAbsolute(width, height);// 附件加上水印图片waterMar.addImage(itextimage);// 完成水印添加waterMar.endText();// strokewaterMar.stroke();}private static Image getImage(File image) throws IOException, BadElementException {return Image.getInstance(image.getPath());}}
  /*** 生成二维码图片* @param url* @param path 文件路径* @param fileName 文件名 不用带后缀* @param width 图片宽度* @param height 图片高度* @return png图片* @throws IOException*/public static File createQrCodeFile(String url,String path,String fileName,int width ,int height) throws IOException{BitMatrix bitMatrix = createCode(url, width, height);bitMatrix = deleteWhite(bitMatrix);BufferedImage image = toBufferedImage(bitMatrix);File file = new File(path + fileName + ".jpg");String format = "jpg";if (!ImageIO.write(image, format, file)) {throw new IOException("Could not write an image of format " + format + " to " + file);}return file;}

3.itext自带的字体列表

name encoding
Courier-BoldOblique
Courier-Bold
Courier-Oblique
Courier
Helvetica-BoldOblique
Helvetica-Bold
Helvetica-Oblique
Helvetica
Symbol
Times-BoldItalic
Times-Bold
Times-Italic
Times-Roman
ZapfDingbats
HYSMyeongJo-Medium UniKS-UCS2-H
HYGoThic-Medium UniKS-UCS2-H
HeiseiKakuGo-W5 UniKS-UCS2-H
HeiseiMin-W3 UniJIS-UCS2-H
MHei-Medium UniCNS-UCS2-H
MSung-Light UniCNS-UCS2-H
STSong-Light UniGB-UCS2-H

使用方法

 BaseFont fontBold1 = BaseFont.createFont("Helvetica-Bold", "", BaseFont.NOT_EMBEDDED);

4.遇到的坑

  1. 使用自定义字体无法加粗
    解决:使用加粗的字体

  2. 使用加粗字体的时候,如果用下面的代码设置字体会导致中文才加粗,英文和数字不加粗

  BaseFont fontBold = BaseFont.createFont(fontBoldPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);fields.addSubstitutionFont(fontBold);

使用下面的方法设置字体,英文中文都会加粗,但是生成的pdf文件很大,模板500kb,生成的pdf 9M

  BaseFont fontBold = BaseFont.createFont(fontBoldPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);fields.setFieldProperty("carBrandAndModel", "textfont", fontBold, null);fields.setFieldProperty("carBrandAndModel", "textsize", bigFontSize, null);fields.setField("carBrandAndModel", vo.getCarBrandAndModel());

原因:fields.setFieldProperty这个方法设置字体时,会去查设置的BaseFont在原pdf中存不存在,不存在就直接把字体全集嵌入到pdf中,导致pdf文件变大。
解决: 只嵌入使用到的部分字体。

BaseFont fontBold = BaseFont.createFont(fontBoldPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontBold.setSubset(true);//嵌入只使用的字体fields.setFieldProperty("carBrandAndModel", "textfont", fontBold, null);
fields.setFieldProperty("carBrandAndModel", "textsize", bigFontSize, null);
fields.setField("carBrandAndModel", displayCardPdfVo.getCarBrandAndModel());

itextpdf通过pdf模板生成pdf文件相关推荐

  1. java 制作pdf模板,Java-pdf模板制作流程-使用pdf 模板生成pdf文件

    Java 使用pdf 模板生成pdf文件 --制作流程 1.      使用工具 adobe acrobat dc.word 2015 2.      使用 word 繪制一個 3*5 的表格並保存, ...

  2. java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...

    Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片) 相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文 ...

  3. Java使用Adobe Acrobat DC根据PDF模板生成PDF文件

    制作模板 首先需要安装Adobe Acrobat DC来制作模板 打开dc工具-->准备表单,然后打开你需要制作的pdf源文件 将文本域拖到你需要代码替换的位置 你可以双击文本域修改当前文本域的 ...

  4. Java中操作pdf模板生成pdf

    [java] iText使用PDF模板生成输出PDF 项目需求涉及到操作pdf模板,根据生成好的模板向里面填充数据 用到的jar包是iText-5.0.6.jar 和iTextAsian.jar pd ...

  5. java itextpdf使用HTML模板生成pdf文件,并设置table

    我们这里是maven项目,导入相应jar包: <dependency><groupId>org.freemarker</groupId><artifactId ...

  6. (三)、IText通过pdf模板生成pdf文件(可用做回执单等功能)

    一.首先制作一个pdf模板 先用word做出个模板界面, 文件另存为pdf格式文件 通过Adobe Acrobat DC软件打开刚刚用word转换成的pdf文件步骤:文件->创建->创建表 ...

  7. java 根据PDF模板生成PDF文件并导出

    1.准备操作的maven包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpd ...

  8. android手机生成pdf格式文件,Android根据pdf模板生成pdf文件

    1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat = 3 ne ...

  9. android程序更改pdf文件格式,Android根据pdf模板生成pdf文件

    1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat = 3 ne ...

最新文章

  1. html邮件链接和锚点链接
  2. 刚子扯谈:谢谢你 要学会尊重文字 即使它写的很狗屎
  3. linux中html的图片显示不出来,如何在HTML中显示原始的rgb图像
  4. linux ipv6 组播地址,ipv6组播地址是什么意思
  5. 【Paper】2021_Distributed Consensus Tracking of Networked Agent Systems Under Denial-of-Service Attack
  6. 浅谈scatter-gather DMA
  7. OAM v1alpha2 新版:平衡标准与可扩展性
  8. NYOJ 714 Card Trick
  9. .NET C# 发送邮件内容嵌入图片
  10. aswing学习笔记4-通过调用面板中的按钮实现主界面动态切换皮肤的问题!
  11. python什么是接口设计_给女朋友讲什么叫接口设计!
  12. 【转】正则表达式之基本概念
  13. python中字典的用法_Python中字典的详细用法
  14. cs1.6正版僵尸服务器ip,cs1.6僵尸服务器
  15. Hashcat使用记录
  16. NMOS和PMOS管
  17. 依米花播放器仿绚丽彩虹播放器程序
  18. 企业文件加密软件如何做到根源防止泄密?全面专业的数据防泄密方案怎么选
  19. 推动区块链技术应用创新河南开展区块链应用场景需求和典型应用案例征集工作
  20. Gitee码云注册和提交代码

热门文章

  1. Redis持久化机制及缓存失效解决方案
  2. 芯科EmberZNet_ZigBee3.0_EFR32MG开发日记五:新建EmberZNet工程1
  3. 二重积分若干例题分析
  4. C#叠加图片的简单代码
  5. MySQL操作mysqldump命令详解
  6. 如何一小时做出裂变海报文案?
  7. yshop前后端分离商城系统v3.2拼团砍价秒杀+商品积分兑换+商城装修
  8. java大津法确定阈值,大津法阈值法代码
  9. 迅雷快车旋风下载地址转换
  10. 康托展开和逆康托展开