java 生成pdf技术选项; 字体 type1、ttf、ottf、cid、woff

JAVA PDF 给PDF添加文字/图片水印(指定内容),并且设置位置 提示:操作PDF其实是一件很简单的事情,比一般的CRUD都简单例如:我们拿到了一个需求,我需要给这个PDF设置一个电子签名就是一张图片盖在这个PDF上,然后输出到服务器的某个指定文件夹中)和年月日自定义的文字提示:以下是本篇文章正文内容,下面案例可供参考提示:关于字体这些东西,还有比如说文字的颜色啊,可以自己去看看,这里只是简单的演示以上就是今天要讲的内容,本文仅仅简单介绍了java操作PDF的使用,代理直接拿过去运行即可。 阅读详情
AI摘要

介绍使用Java生成PDF的最佳实践,包括itext7、pdfhtml、freemarker的组合应用,以及解决字体、分页、页码等问题。

java生成pdf技术选型

技术选型

java生成pdf最终选择itext7+pdfhtml+freemarker。为什么使用这个组合呢?生成pdf,通常会用html转pdf,这是因为html+css便于调节样式,否则使用原生库,用java直接生成pdf,太繁琐,改一点样式都要改java代码;所以首先要用html,那就要找个模板引擎将数据填充到html,如果不用模板引擎,用js填充的话,就得用到浏览器引擎解析js,js发送http request获取数据,挺麻烦的,所以不如用模板引擎;有了模板引擎,还要有html-pdf转化器,可以将填充后的html转化为pdf;基于以上分析,必须要用到html+css、模板引擎、html-pdf转化器,相应的最终选择itext7+pdfhtml+freemarker。

  • itext7是itext的最新版本,功能丰富并较itext5做了很大优化;
  • pdfhtml是itext的套件之一,底层依赖itext,它支持html5、css3,能将html转换为pdf;
  • freemarker是apache的模板引擎,用来将数据填充到html;

itext7+pdfhtml+freemarker vs flyingsaucer+itext5 vs wkhtmlTopdf

  • flyingsaucer与pdfhtml作用相同,用来将html转为pdf,但只支持css2,并且底层依赖itext5(最新的是itext7),非官方的,所以放弃;
  • wkhtmlTopdf使用浏览器引擎解析html,然后将html转换为pdf,所以还原度较高,但是命令行式的,并且要预先安装,每次导出pdf就是执行一次shell命令,这就等于从jvm开了一个进程,从性能、繁琐性考虑,放弃;

字体

itext分为3种字体,Standard Type 1 Fonts (14种)、shipped fonts(12种)、系统字体,Standard Type 1 Fonts 因为版权问题不允许嵌套到pdf中,

Standard Type 1 Fonts

字体变种
TimesTimes-Roman
TimesTimes-Bold
TimesTimes-Italic
TimesTimes-BoldItalic
HelveticaHelvetica
HelveticaHelvetica-Bold
HelveticaHelvetica-Oblique
HelveticaHelvetica-BoldOblique
CourierCourier
CourierCourier-Bold
CourierCourier-Oblique
CourierCourier-BoldOblique
SymbolSymbol
ZapfDingbatsZapfDingbats
可以看到Times 、Helvetica、Courier每种都有4中变种分别是常规、加粗、倾斜、加粗倾斜,共12种,再加上Symbol、ZapfDingbats一共14种,这些字体只包含了西方字符,所以用这些字体生成汉语肯定是不显示的;因为版权问题,这些字体不能嵌套到pdf中,itext假设pdf 阅读器会搭载这些字体或者操作系统有这些字体;

shipped fonts

shipped fonts含有sans 、serif 、monospaced 3种字体,类似的每种有4种变体,常规字体、加粗字体、倾斜字体、加粗倾斜字体,默认嵌套。

系统字体

系统字体指的是,操作系统上的字体,比如在windows中,字体路径是C:\Windows\Fonts,最好不要注册系统字体,因为会加载很多字体,这会消耗资源且顺序不可控,所以,在不同操作系统上,pdf可能表现不一样。

html生成pdf关键代码

springboot中,生成pdf的核心代码

ConverterProperties converterProperties = new ConverterProperties();
      DefaultFontProvider fontProvider = new DefaultFontProvider(false,
              false,false,"simfang");
      Class<MyController> myControllerClass = MyController.class;
      logger.info("TreatmentController的ClassLoader是:{}",myControllerClass.getClassLoader());
      String fontPath = myControllerClass.getResource("/simfang.ttf").toString();
      fontProvider.addFont(fontPath);
      //注意templates以/结尾表示文件夹
       String baseUri = myControllerClass.getResource("/templates/").toString();
      logger.info("itext的baseUri是:{}",baseUri);
      converterProperties.setBaseUri(baseUri);
      converterProperties.setFontProvider(fontProvider);
      HtmlConverter.convertToPdf(byteArrayInputStream,
              response.getOutputStream(), converterProperties);

注意,

DefaultFontProvider(false,
              false,false,"simfang");

利用了构造方法

DefaultFontProvider(registerStandardPdfFonts,
              registerShippedFonts,registerSystemFonts,defaultFontFamily);

表示不注册标准字体、不注册搭载字体、不注册系统字体、默认字体是仿宋,推荐这样使用,可确保字体的唯一性。

设置baseuri

springboot中设置图片、字体等的baseuri,注意文件夹以/结尾

//注意templates以/结尾表示文件夹
       String baseUri = myControllerClass.getResource("/templates/").toString();
      logger.info("itext的baseUri是:{}",baseUri);

常见问题

pdf分页

pdf分页用css来实现,在想分页的地方添加

page-break-after:always;

pdf页码和页脚

用css来实现

 @page {
    @bottom-left {
        font-size: 12px;
        content: "这就是页脚";
    }
    @bottom-right {
        /*这是当前页、总页数*/
        content: counter(page) "/" counter(pages);
    }
    margin-bottom: 70px;
}

在这里插入图片描述

如果首页不想要页脚和页码,则利用:first伪元素

@page:first{
   @bottom-left {
       content: none;
   }
   @bottom-right {
       content: none;
   }
}

页码不正确,多了一页

可能是在最后一页,设置了分页导致,去掉就好了。

pdf不显示汉字、乱码

  • 不显示,不显示有两种原因

    • 字体用的不对。不显示是因为字体用的不对,比如用了Helvetica字体,这个字体只有英语字母、英文符号等字符,汉字用这个字体,肯定不会显示。
    • 字体未嵌入到pdf,字体包含目标字符,但未嵌入到pdf中,在其他电脑上打开时,恰巧这个电脑没有所使用的字体那么也不会显示,这个时候就要将字体内嵌到pdf中,当然pdf阅读器也可能使用相近字体替代,这时“替代字体”就是“实际字体”;
  • 乱码
    乱码指的是,对字体使用了错误的编码。比如仿宋,你用Helvetica去编码肯定不行。编码指的是字符编码,iso8859-1、gbk、unicode之类的

怎样查看pdf字体?

  • 查看pdf使用的全部字体

    • 使用Adobe Acrobat打开pdf,查看pdf字体,文件---->属性—>字体或者使用快捷键ctrl+d
    • 在这里插入图片描述
  • 查看某个文字或者段落使用的字体

    • 在选中目标文字,右击编辑文本,右侧显示字体。
    • 在这里插入图片描述

windows上生成的pdf与linux生成的pdf,字体不一样

查看pdf字体,发现使用了很多字体,怀疑是用了系统字体,将registerSystemFonts设置为false后修复。

type1、ttf、ottf、cid、woff名字解释

  • type1就是上文提到的Standard Type 1 Fonts,是adobe公司推出的,也叫PostScript Type 1 简称ps1,不再推荐使用,基于adobe pdf阅读器已经搭载了该字体的假设,不允许内嵌到pdf。
  • true type是apple和微软开发的,晚于type1,并且逐渐成为主流,adobe目前转向true type,比type1支持更多的字符集、布局,ttf就是 true type font的缩写。
  • open type 跨平台的, Adobe and Microsoft出品,adobe已经将他的字体库全部转为open type,otf就是open type font的缩写,跨平台支持苹果和windows,支持更多的字符集和排版特性。基于true type的open type字体结尾是ttf
  • eof= Embedded OpenType,它是对OpenType 字体的压缩版,被微软设计用来在web网页中嵌入使用。只有微软的IE浏览器支持,跟WOFF正好相反
  • woff=Web Open Font Format ,在web页面中的一种字体格式,它其实是 OpenType 或者 TrueType被压缩了并且带有一些元数据。woff主要有两个目的,第一它是专门用来当作web字体的而不是桌面字体,第二减少web字体在网络传输时的延迟。woff2是woff的下一代字体,比woff平均大小能小30%,传输速度更快。
  • cid是character id的意思,一般是type1、true type
  • type1、ttf、otf、woff、woff2的不同

文档

itext官网---->developer---->knowledge base—>Ebooks

https://stackoverflow.com/questions/83320/what-is-the-difference-between-truetype-fonts-and-type-1-fonts

使用fpdf库生成PDF文件:配置多种语言字体并写入多种文字 fpdf是一个功能强大的库,可以让我们通过编程方式创建PDF文档,并包含了丰富的特性和选项。要在PDF文档中使用不同的语言文字,我们需要配置相应的字体。我们可以从各种来源获取不同语言的字体文件,并将其放在我们的项目目录中。希望这篇文章能够帮助你了解如何使用fpdf库生成PDF文件并配置多种语言字体写入多种文字。使用fpdf库,我们可以轻松地生成包含多种语言文字的PDF文件。安装完成后,我们就可以开始使用fpdf库来生成PDF文件了。方法,我们可以配置不同语言的字体并写入相应的文字。 阅读详情

相关推荐

java生成pdf字体和模板

java生成pdf字体和模板

利用itext将html文件转化pdf文件(四)——字体样式

在利用itext将html文件转化为pdf文件的过程中,需要适当的调整字体,下面介绍字体的使用样式:字体支持的样式            itext核心库中主要支持一下几个各种的字体文件:.AFM/.PFB/.TTF/.otf/.ttc/.wof    2.  利用DefaultFontProvider 只是支持 14 Standard Type 1 fonts and 12 fonts 主要字体...

大黄奔跑 1万+

数字摄影与摄像中的图像信号处理器(ISP):流程与经典算法详解

图像信号处理器(Image Signal Processor, ISP)是现代数字成像系统(如智能手机、数码相机、网络摄像头等)中的核心组件,扮演着将图像传感器(如CMOS或CCD)捕获的原始光电信号转换为高质量、可供观看或进一步处理的数字图像的关键角色。在数字摄影和摄像的整个链路中,光线首先通过镜头(Lens)聚焦到图像传感器上,传感器将光信号转换为模拟电信号,随后经过模数转换(A/D转换)变为原始的数字图像信号。

qq_44682523的博客 3724

探索FontProvider:一款创新的字体管理神器

探索FontProvider:一款创新的字体管理神器 是一个开源项目,旨在为开发者提供一种便捷的方式来在Android应用中动态加载和管理自定义字体。它通过一个服务接口,使应用能够在运行时获取并应用各种字体,极大地增强了UI设计的灵活性和用户体验。 技术解析 FontProvider 使用了Android的ContentProvider机制,这是一种在应用程序之间共享数据的标准方式。在这个项目中,...

gitblog_00067的博客 632

STM32MP157+AD7606BSTZ四通道IEPE传感器控制器实战(附电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器控制器设计实战,涵盖硬件架构、数据采集芯片对比、关键电路设计及信号处理算法。通过双核协同工作和优化算法,实现高精度振动监测与故障诊断,适用于工业机械状态监测等场景。

weixin_29171129的博客 367

jQuery 版本怎么选?别一上来就用最新版,老项目里这个坑很常见

jQuery 是一个封装好的 JavaScript 函数库,简称 JQ它的核心理念是jQuery 有 1.x、2.x、3.x 三个主要版本系列2.0 以上版本不再支持 IE6、IE7、IE8版本选择不能只看“新不新”,而要看项目兼容性和实际需求.min.js是压缩版文件,生产环境常用使用 jQuery 前必须先通过<script>正确引入基本就是没引入或引入失败可以快速绑定点击事件.animate()可以快速实现动画效果,但定位属性要设置好。

Web安全工具库 387

HTML转PDF字体的坑,搞了半天

itext提供可HTML转PDF的工具包,但是在中文字体时也许会遇到意想不到的问题。特别宋体对应的粗体。 0x01:引入itext包 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.1.11</version> <...

天行健,君子以自强不息;地势坤,君子以厚德载物。 8990

【数据集】全球湿度数据集总结

【数据集】全球湿度数据集总结

WW、forever的博客 1661

利用freemark打印pdf文件以及中文乱码的问题

1. 添加dependency在pom.xml文件中 <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> &l

pengnf 1431

数字后端:版图基础seal ring

seal ring结构是为了防止划片或封装对芯片造成破坏,从而在芯片与划片道(scribe line)之间添加的一圈保护环

m0_61544122的博客 1万+

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 143

第6章:在pdfHTML中使用字体

到目前为止,我们还没有花太多的注意力在将 HTML 转换为 PDF 时使用的字体上。我们知道,当没有指定字体时,Helvetica 是iText 使用的默认字体(第2章),我们知道如果需要嵌入字体,pdfHTML 附带一些内置字体(第4章),但我们还没有清楚地了解到支持哪些字体。

zxstrive的专栏 667

想重装OpenClaw?先执行这4步彻底卸载,避免配置冲突

在重装OpenClaw之前,彻底卸载是非常重要的一步。如果不彻底卸载,可能会导致: - 残留的配置文件与新安装的版本冲突 - 旧的依赖包干扰新的安装过程 - 服务冲突导致启动失败 - 数据混乱影响系统稳定性

一键难忘的博客 1043

使用com.itextpdf:html2pdf 中文无法打印的问题

添加默认地址库,或者使用指定的地址库即可。

L'Étranger的博客 995

华为FusionCompute之计算虚拟化

华为FusionCompute之虚拟化

jks212454的博客 2452

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

otf转ttf并实现字体压缩

otf转ttf并实现字体压缩

一个网络搬砖的斜杠青年 2158

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

itext读html模板,使用Itext7+thymeleaf 实现html转PDF功能

使用Itext7+thymeleaf 实现html转PDF功能方案:1:导入依赖2:准备字体、导出文件的路径、写好Thymeleaf的html模板3:设置字体,字符集4:设置传入Thymeleaf的html模板参数5:在导出的目录下创建一个pdf文件6:将html元素转换到PDF中[Maven:com.itextpdf:layout:7.1.7]com.itextpdf.layout.font....

weixin_29083649的博客 961

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

实现Html转PDF

引入pom <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>2.0.2</version> </dependency> 实现 public static void main(String[] args) throw

qq_37924396的博客 300

由浅入深完全理解Java动态代理

前言 看Retrofit源码的时候涉及到了Java动态代理,这个知识点之前在学习Java反射的时候就碰到过,不过也仅仅是停留在理论的学习。终于在Retrofit源码的时候看到了实际的使用,也是格外兴奋,正好以此为契机,把Java动态代理这一块整理一下。 本文也是尽量由浅入深的讲,过多理论知识也不多加阐述。 本文参考 https://www.zhihu.com/question/2...

许佳佳的博客 3451

Java使用itext5实现PDF表格文档导出(图片/样式/字体)

绘制table 每行列设计样式处理、图片需要独立处理、正常业务场景下有合并列 合并行场景。二:vue html2Canvas+jspdf 组件实现。二、vue html2Canvas+jspdf。ps:后端实现样式需要花费时间调整。一、itext5 java实现。ps:样式需要进一步调整。最终样式需要自己慢慢调整。

double_hll123的博客 8675

Linux字体问题

Chinese font is always a problem in my Linux, every time I install a brand new Linux, dealing with font kills my time. Therefore, I will list the font problems encountered in this thread. 1. syste

狂战士之家 901

java pdf 中文字体_java-pdf-itext7、itextpdf 生成pdf 文档,使用pdf模板生成(支持中文字体)...

java-pdf-itext7、itextpdf 生成pdf 文档,使用pdf模板生成(支持中文字体)itext7 内置对中文(CJK字体)进行了支持,不在依赖其他组件。//处理中文问题PdfFont font = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);一、iText 7 资料:官网:http://d...

weixin_35473679的博客 976

OTF格式字体如何转成TTF格式并在条码打印软件中使用

最近有小伙伴反馈说自己下载的OTF格式的字体文件安装后字体在中琅条码打印软件中无法使用,有的是可以在软件中显示出来,但是选择后发现数据变空白或者外观不是这个字体的外观,又或者在中琅条码打印软件中选择字体时没有这个字体名称,遇到这个情况怎么办呢?

2301_76905944的博客 1899

iText中文教程~ 字体

simsun.ttc(宋体和新宋体)simfang.ttf(仿宋体)simkai.ttf(楷体)simhei.ttf(黑体)TrueType字体集合的应用。TrueType 字体应用。

小强快跑~~ 2398

Java操作PDF文件,如此简单

使用 PdfFontFactory 的 createFont 创建一个中文字体,并将中文字体设置到 document 中。在项目中经常需要 PDF 文件中打印表格,这时就可以使用 Table 对象,创建一个个单元格并将表格内容写入单元格中。你好,itext”));图片的设置也很简单,创建 Image 对象填充到 document 中就可以了。(img-THY0gKh7-1713163498458)](img-FjWQSqkI-1713163498458)]//字体文件可以使用 windows 系统中的。

2401_83915900的博客 2798

itextpdf(html2pdf)有这样的坑?java导出pdf必看

背景 公司最近有做做Java导出pdf的需求,因为之前没有做过的缘故,所以从网上找来了itextpdf的包,前期做的还是非常顺利的,本地测试都是非常的顺利,正当我以为导出pdf如此简单的时候,上Linux测试就踩了大坑。 <!-- 字符串转pdf --> <dependency> <groupId>com.itextpdf</groupId> <artifactId&g...

佘凡J工作之余的分享 8686
上一篇: vue attribute中使用字符串模板 template string
下一篇: nginx net::ERR_CONTENT_LENGTH_MISMATCH
wangjun5159
博客等级 码龄17年 602粉丝 506原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值