首页 > 编程知识 正文

java动态生成pdf,java实现doc转换pdf

时间:2023-05-06 16:56:21 阅读:20333 作者:3986

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转换器,并相应地最终使用iid

itext7是itext的最新版本,功能丰富,比itext5进行了大幅优化; pdfhtml是itext的套件之一,其基础依赖于itext,支持html5、css3,并将html转换为pdf; freemarker是apache的模板引擎,用于将数据输入到html中; itext7pdfhtmlfreemarkervsflyingsauceritext5vswkhtmltopdfflyingsaucer与pdfhtml相同,用于将html转换为pdf,但仅支持css2。 基础依赖于itext5(因为wkhtmlTopdf使用浏览器引擎分析html,并将html转换为pdf,所以恢复速度很高;但是,要进行命令行表达式且预先安装,请在每次导出pdf时执行shell命令。) 这将从jvm中打开一个过程,从性能和复杂性的角度来看,必须放弃。 字体itext分为三种字体: Standard Type 1 Fonts(14种)、shipped fonts (14种)和系统字体。 标准类型1字体因版权问题不允许嵌套在pdf中。

标准类型1 fonts字体变种times times-romantimestimes-boldtimestimes-italictimestimes-bolditalichelveticahelveticahelvetivetimes hel vet ICA-obliquehelveticahelvetica-boldobliquecouriercourier-boldcouriercourier-obliquecouriercourier-boldooor 可见Courier的各4种变种通常分别为粗体、斜体、粗斜体12种。 此外,Symbol和ZapfDingbats共有14种类型,这些字体仅包含西洋字符,因此用这些字体生成中文时一定不会显示。 由于版权问题,这些字体无法嵌套在pdf中。 itext假设pdf阅读器有这些字体,或者操作系统有这些字体。

shipped fonts shipped fonts包含三种字体: sans、serif和monospaced 3。 每个类似的字体都有四种不同的变体:常规字体、粗体字体、斜体字体、粗体斜体字体和默认嵌套。

系统字体是操作系统上的字体,例如在windows上,字体路径为C:WindowsFonts,最好不要注册系统字体。 由于加载了许多字体、占用了资源且无法控制顺序,不同的操作系统可能会有不同的pdf表示形式。

html生成用pdf键码springboot生成pdf的核心代码

converterpropertiesconverterproperties=newconverterproperties (; defaultfontproviderfontprovider=newdefaultfontprovider (false、false、false、' simfang ' ); classmycontrollermycontrollerclass=my controller.class; logger.info (' treatment controller的ClassLoader为:{} ',mycontrollerclass.getclass loader ) ); string font path=mycontrollerclass.get resource (/simfang.TTF ).toString ); font provider.addfont (字体路径); 请注意,templates以/结尾文件夹stringbaseuri=mycontrollerclass.get resource ('/templates/' ).toString )。 Logger.info(itext的基本uri为:{} )、基本uri ); 转换器属性. set base uri (base uri;

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名字解释 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字体结尾是ttfeof= 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 typetype1、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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。