itextpdf 解析带中文的html问题
官网连接 官网上有很多DEMO,下面就说几个我碰到的问题!
Question:
1. 中文不显示 或者是乱码(本打算用Apache pdfbox来实现业务,但是折腾了一个上午也没解决中午乱码问题,就找到itextpdf 替换,如果有人知道怎么解决pdfbox 乱码,请告知,毕竟开源的不要钱!)
2. 页面纸张大小设置
3. 解析带html标签的时候不能解析中文问题
Answer:
1. 对于中文乱码,itextpdf 可以通过读取字体文件解决,STFANGSO.TTF 是我本机上的仿宋的字体文件, 通过如下方式获取字体对象。只能读取.TTF格式文件,其他格式的字体文件会报错,这点要注意。然后再每个new Paragraph(arg1,arg2)的时候,arg1是一个要显示的对象,arg2就是你获得的中文字体。
BaseFont bfChinese =BaseFont.createFont("C:\\Windows\\Fonts\\STFANGSO.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);
datatable.addCell(new Paragraph(tableHeader[i], fontChinese));
这样中文问题就解决了。
2. 对于纸张大小设置,参见官方的API
new Document();有三种方式,无参构造,带一个参数的构造和带五个参数的构造。
无参构造自不用解释、
带一个参数的构造,是一个com.itextpdf.text.Rectangle 对象 可以通过com.itextpdf.text.PageSize 点出很多常用的文件大小、
带五个参数的构造,就是可以自定义一张大小的画布了。
3. 由于业务需要将带html标签的文本解析为PDF,但是发现无论解析出来的中文全丢失了,itext自身提供解析html的工具类,但是很多人说需要修改源码,但是我试过也不行。偶然发现一篇使用itext解析html片段,而且解决中文显示问题的博客http://www.cnblogs.com/mvilplss/p/5646675.html,便尝试了一下,居然可以显示中文了(毕竟,完整的html也是多个html片段组成的吗)
自定义一个解析html文本的标签类,可以设定字体大小
public class MyXMLWorkerHelper {
public static class MyFontsProvider extends XMLWorkerFontProvider {
public MyFontsProvider() {
super(null, null);
} @Override
public Font getFont(final String fontname, String encoding, float size, final int style) {
size=9.0f;//可以指定字体大小,不设置默认为12pt
String fntname = fontname;
if (fntname == null) {
fntname = "宋体";
}
return super.getFont(fntname, encoding, size, style);
}
} public static ElementList parseToElementList(String html, String css) throws IOException {
// CSS
CSSResolver cssResolver = new StyleAttrCSSResolver();
if (css != null) {
CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes()));
cssResolver.addCss(cssFile);
} // HTML
MyFontsProvider fontProvider = new MyFontsProvider();
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
htmlContext.autoBookmark(false); // Pipelines
ElementList elements = new ElementList();
ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);
CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline); // XML Worker
XMLWorker worker = new XMLWorker(cssPipeline, true);
XMLParser p = new XMLParser(worker);
html = html.replace("<br>", "").replace("<hr>", "").replace("<img>", "").replace("<param>", "")
.replace("<link>", "");
p.parse(new ByteArrayInputStream(html.getBytes())); return elements;
} }
用例Demo 注意字体必须是ttf格式的,我试了用ttc的会报错。
private static void itextPdf() throws Exception {
Document document = null;
BaseFont bf = null;
Font fontChinese = null;
bf = BaseFont.createFont("D:\\simsun.ttf", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
String dest = "D:\\itextout.pdf";
String inFile = "d:\\in.html";
File file = new File(inFile);
StringBuffer sBuffer = new StringBuffer();
BufferedReader reader = null;
reader = new BufferedReader(new FileReader(inFile));
String tempString = null;
int line = 1;
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
// 显示行号
System.out.println("line " + line + ": " + tempString);
line++;
sBuffer.append(tempString);
}
reader.close(); OutputStream outputStream = new FileOutputStream(new File(dest));
try {
/** create the right font for chinese **/
bf = BaseFont.createFont("D:\\simsun.ttf", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
fontChinese = new Font(bf, 10);
document = new Document(PageSize.A4); /** get the html content from javabean and convert to string **/
PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream);
document.open(); /** add the head of the pdf **/
Paragraph head = new Paragraph("确认函", new Font(bf, 11));
head.setAlignment(1); // 0 align to the left , 1 align to the center
document.add(head);
/** add the content of the pdf **/
Paragraph context = new Paragraph();
ElementList elementList =MyXMLWorkerHelper.parseToElementList(sBuffer.toString(), null);
for (Element element : elementList) {
context.add(element);
}
document.add(context); document.add(new Paragraph(" "));
document.add(new Paragraph(
"亲笔签名/公司公章: _______________________________", fontChinese));
document.add(new Paragraph("日期: ", fontChinese));
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
itextpdf 解析带中文的html问题的更多相关文章
- nginx解析带中文的url重定向之后404问题
首先,有这样一个需求:一个系统的图片存储是放在upyun上的,现在有个客户需要本地化部署,所以需要将图片进行本地存储.为了兼容,图片存储的路径格式保持和在upyun上的存储路径一致.在upyun上的存 ...
- 带中文索引的ListView 仿微信联系人列表
因为各种原因,项目经理和产品经理把我做的东西给否定了,所以决定分享出去. 主要功能: 1 .带中文索引的ListView 2.自己定义顶部搜索视图,能够对返回button,搜索button加入事件监听 ...
- 1.6 使用电脑测试MC20的读取带中文短信功能
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- plsql查找不到带中文的纪录
今天在另外的电脑用plsql查询不到带中文的记录 select * from test where name like '%测试%' 然后发现是系统的环境变量还没设置好所造成的.在系统变量加入如下变量 ...
- 带中文的路径导致NSURL初始化一直为null的问题
一.问题描述 在学习Ojective-C过程中,需要读取文件中的内容,但发现指针变量url的值一直为nil. 代码如下: NSString *strUrl=@"file:///Users/f ...
- 制作、解析带logo的二维码
用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码 工具:GooleZXing 首先下GooleZXing的jar包. -------- ...
- PHP - 传入WebService服务端带中文字符的序列化字串不能反序列化的解决方法
因工作需要,用了web服务,通过远程调用的方式来检索雅虎拍卖数据.前几天遇到一个问题,现在记录一下 客户端: $res = $this->client->call('Get_YahooDa ...
- iOS Get方式带中文不能请求网络
今天发现一个蛋疼的问题,使用ASIHTTPRequest Get方式请求数据时候带中文,iOS客户端不能正确进行网络请求. NSURL *url = [NSURL URLWithString:@htt ...
- IE浏览器url中带中文报错的问题;以及各种兼容以及浏览器问题总结
1.解决IE浏览器url带中文报错 /* encodeURI()解决IE浏览器请求url中带中文报错的问题 */ URL = encodeURI("<%=basePath%>ve ...
随机推荐
- 08 JS的事件流的概念(重点)
在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以 ...
- kubernetes实战篇之为默认账户创建镜像拉取密钥
系列目录 上一节我们分别使用纯文本账户密码和docker的config文件一创建一个kubernetes secret对象,并且把它添加到containers的imagePullSecrets字段用以 ...
- 基于Google Earth Engine的全国地表温度反演
国内研究landsat8温度反演的人员很多,但是现有算法一般都是一景为例子,进行开展. 这有一个局限性,当研究的尺度很大时,就需要比较大的运算量了,例如全省温度,全国温度,全球温度,当然大家可能会说, ...
- 大白话5分钟带你走进人工智能-第31节集成学习之最通俗理解GBDT原理和过程
目录 1.前述 2.向量空间的梯度下降: 3.函数空间的梯度下降: 4.梯度下降的流程: 5.在向量空间的梯度下降和在函数空间的梯度下降有什么区别呢? 6.我们看下GBDT的流程图解: 7.我们看一个 ...
- ZooKeeper入门(二) Zookeeper选举
1 背景 1.1 什么是leader选举 在zookeeper集群中,每个节点都会投票,如果某个节点获得超过半数以上的节点的投票,则该节点就是leader节点了 1.2 zookeeper集群选举le ...
- HDU 6043:Colorful Tree(树上统计所有路径总颜色数)***
题目链接 题意 给出一棵有n个结点的树,每个结点有一个颜色,问在这棵树的所有路径中,每条路径的颜色数求和是多少. 思路 求每种颜色的贡献可以转化为总的和减去每种颜色在哪些路径上没有出现的贡献,一个颜色 ...
- Python爬虫入门:爬取pixiv
终于想开始爬自己想爬的网站了.于是就试着爬P站试试手. 我爬的图的目标网址是: http://www.pixiv.net/search.php?word=%E5%9B%9B%E6%9C%88%E3%8 ...
- 利用LDAP操作AD域
LDAP操作代码样例 初始化LDAP 目录服务上下文 该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ld ...
- webpack-dev-server 小记 原理介绍 概念解读
使用 DevServer 提供 HTTP 服务而不是使用本地文件预览 监听文件的变化并自动刷新网页,做到实时预览 支持 Source Map,以方便调试 对于这些,Webpack 都为我们考虑好了.W ...
- ~~Python解释器安装教程及环境变量配置~~
进击のpython Python解释器安装教程以及环境变量配置 对于一个程序员来说,能够自己配置python解释器是最基础的技能 那么问题来了,现在市面上有两种Python版本 Python 2.x ...