富文本转pdf,html转pdf,itext转pdf(解决中文显示问题)

本文介绍了如何使用iText框架将包含HTML的富文本转换为PDF,强调了处理中文显示问题、样式应用以及解决在非Windows系统上字体问题的策略。在转换过程中,需要注意HTML标签的完整性和字体资源的正确引用。
摘要由CSDN通过智能技术生成

概要

项目中,管理员需要编辑合同模板,客户根据模板填写信息后,系统生成pdf文件上传到远程端。我们的合同模板在项目中用的是富文本编辑,存储到数据库中是带有html标签的字符串。
html可以直接转为pdf,网上有很多工具/框架。也有人分析了各种工具的优劣。可自行搜索。这里使用的是iText框架

坑点

1.富文本编辑器编辑的文本是带有样式的,一定切记切记要前端把编辑器的样式文件给你!!!否则转换后的pdf没有样式
2.远程服务器(非win系统)中文显示不出来的问题,就是字体的问题。网上搜有三种方式,我这的处理是将1)win10系统的字体文件拷贝出来,放到项目的资源文件夹中,2)代码引入字体,3)在html的body标签加上字体<body style="font-family: SimSun;">(字体可以换成其他的)
3.本地生成的pdf打开没问题,但上传到远程服务器后打不开。我怀疑是因为生成pdf后该文件被占用,没有及时释放该File 对象,导致上传的pdf被破坏。我的解决方式是将上传文件步骤与生成pdf分别写到两个方法,暂时这么处理(哪位大佬知道原因的可以告诉下嘛?)
4.itext转换pdf,对标签的要求比较高。html文件的标签一定要有头有尾,像<br>要转换成<br/>
5.报没有document的错误时(具体错误信息忘了),首先考虑字体名称是不是写错了。

1 数据准备

富文本编辑页面
富文本内容
保存到数据库是这样的

<p class="ql-align-center"><strong>内容测试</strong></p><p><strong>甲方(出租方) :</strong></p><p><strong>乙方(承租方) :</strong></p><p>甲乙双方就乙方租赁甲方电梯轿厢设置看板媒体(以下简称“看板”)、刊发广告一</p><p>事进行友好协商,达成以下条款,双方共同执行:</p><p class="ql-align-center"><strong>第一条租赁地点</strong></p><p>甲方同意将市区花园(大厦/小区)共部电梯租赁给乙方设置看板,刊发广告。</p><p class="ql-align-center"><strong>第二条设置方式和范围</strong></p><p>1、看板设置于电梯轿厢壁上(超薄型,厚度不超过2cm、长度:、宽度: ;),用</p</
  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
下面是一个使用iText7将富文本HTML换为PDF并添加动态页数和水印的示例: ```java import com.itextpdf.html2pdf.ConverterProperties; import com.itextpdf.html2pdf.HtmlConverter; import com.itextpdf.kernel.colors.ColorConstants; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.kernel.pdf.xobject.PdfFormXObject; import java.io.File; import java.io.IOException; public class RichHtmlToPdfConverter { public static void main(String[] args) throws IOException { String html = "<html><body><h1>Hello, World!</h1></body></html>"; String pdfPath = "output.pdf"; PdfWriter writer = new PdfWriter(pdfPath); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setDefaultPageSize(new Rectangle(PageSize.A4.getLeft(), PageSize.A4.getBottom(), PageSize.A4.getRight(), PageSize.A4.getTop())); PdfFont font = PdfFontFactory.createFont("path/to/font.ttf", PdfEncodings.IDENTITY_H, true); int pageNum = 1; ConverterProperties props = new ConverterProperties(); HtmlConverter.convertToPdf(html, pdfDoc, props); int n = pdfDoc.getNumberOfPages(); for (int i = 2; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); PdfCanvas canvas = new PdfCanvas(page); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText(String.format("Page %d", pageNum)) .endText(); pageNum++; } PdfFormXObject watermark = new PdfFormXObject(new Rectangle(0, 0, 100, 100)); PdfCanvas canvas = new PdfCanvas(watermark, pdfDoc); canvas.setFillColor(ColorConstants.LIGHT_GRAY); canvas.setStrokeColor(ColorConstants.LIGHT_GRAY); canvas.rectangle(0, 0, 100, 100); canvas.fill(); canvas.beginText() .setFontAndSize(font, 24) .moveText(20, 50) .showText("Confidential") .endText(); pageNum = 1; for (int i = 1; i <= n; i++) { PdfPage page = pdfDoc.getPage(i); canvas = new PdfCanvas(page); canvas.addXObject(watermark, 0, 0); canvas.beginText() .setFontAndSize(font, 12) .moveText(pdfDoc.getDefaultPageSize().getRight() - 72, 36) .showText(String.format("Page %d", pageNum)) .endText(); pageNum++; } pdfDoc.close(); } } ``` 在上面的示例中,我们首先创建一个PdfWriter和PdfDocument对象,然后设置默认页面大小为A4纸张大小。然后使用iText7的HtmlConverter将富文本HTML字符串换为PDF文档。在HTML字符串为PDF文档后,我们使用循环遍历文档中的每个页面,并在每个页面的右下角添加动态页码。最后,我们创建一个PdfFormXObject对象,添加水印文本“Confidential”,并将其添加到每个页面中。 请注意,上面的示例中的代码片段是未经测试的,仅供参考。您需要根据您自己的需求进行修改和调整。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值