Html字符串生成pdf的方法 支持中文及中文换行 可行demo和jar
中文换行修改好后的jar:http://download.csdn.net/download/weixin_36795183/9983888
pdf.JS http://download.csdn.net/download/weixin_36795183/9983904
一:遇到的问题;
1、 中文不支持
2、 中文不换行
3、 如何显示
4、 不显示签章
二:生成(根据html字符串来生成pdf,方便我们的替换)
下边是应用itext进行编写的生成pdf代码(这里要支持中文需要导入相应的iTextAsian jar包)
public static void myContractPdf(String template,long investid)throws DocumentException, IOException{
String outputFile = Play.applicationPath+File.separator+“ssqFile”+File.separator+String.valueOf(investid)+".pdf";
FileOutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(Play.applicationPath+File.separator+“public”+File.separator+“pdfjs”+File.separator+“font”+File.separator+“simsun.ttc”, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
StringBuffer html = new StringBuffer();
// DOCTYPE 必需写否则类似于 这样的字符解析会出现错误
html.append("");
html.append("").append("")
.append("")
.append(“”)
.append("")
.append("");
html.append(repaceContractTemplate(template, investid));
html.append("");
renderer.setDocumentFromString(html.toString());
renderer.layout();
renderer.createPDF(os);
os.close();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
这时我们已经生成了一份支持中文的pdf。但是我们会发现他并没对中文进行换行,好多文本已经超出界限丢失了。
三、中文换行
原因就是这itaxt是国外编写的。对中文的支持并不好,它是对空格惊醒换行的,而中文却不是,所以我们就需要改变一下源代码,让其支持中文
重写Breaker,添加中文识别。
- // Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
- // Jad home page: http://kpdus.tripod.com/jad.html
- // Decompiler options: packimports(3) fieldsfirst ansi space
- // Source File Name: Breaker.java
- package org.xhtmlrenderer.layout;
- import java.text.BreakIterator;
- import org.xhtmlrenderer.css.constants.IdentValue;
- import org.xhtmlrenderer.css.style.CalculatedStyle;
- import org.xhtmlrenderer.extend.TextRenderer;
- // Referenced classes of package org.xhtmlrenderer.layout:
- // LineBreakContext, LayoutContext
- public class Breaker
- {
- public Breaker()
- {
- }
- public static void breakFirstLetter(LayoutContext c, LineBreakContext context, int avail, CalculatedStyle style)
- {
- org.xhtmlrenderer.render.FSFont font = style.getFSFont©;
- context.setEnd(getFirstLetterEnd(context.getMaster(), context.getStart()));
- context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
- if (context.getWidth() > avail)
- {
- context.setNeedsNewLine(true);
- context.setUnbreakable(true);
- }
- }
- private static int getFirstLetterEnd(String text, int start)
- {
- int i = start;
- do
- {
- if (i >= text.length())
- break;
- char c = text.charAt(i);
- int type = Character.getType©;
- if (type != 21 && type != 22 && type != 29 && type != 30 && type != 24)
- break;
- i++;
- } while (true);
- if (i < text.length())
- i++;
- return i;
- }
- public static void breakText(LayoutContext c, LineBreakContext context, int avail, CalculatedStyle style)
- {
- org.xhtmlrenderer.render.FSFont font = style.getFSFont©;
- IdentValue whitespace = style.getWhitespace();
- if (whitespace == IdentValue.NOWRAP)
- {
- context.setEnd(context.getLast());
- context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
- return;
- }
- if (whitespace == IdentValue.PRE || whitespace == IdentValue.PRE_WRAP || whitespace == IdentValue.PRE_LINE)
- {
- int n = context.getStartSubstring().indexOf("\n");
- if (n > -1)
- {
- context.setEnd(context.getStart() + n + 1);
- context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
- context.setNeedsNewLine(true);
- context.setEndsOnNL(true);
- } else
- if (whitespace == IdentValue.PRE)
- {
- context.setEnd(context.getLast());
- context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
- }
- }
- if (whitespace == IdentValue.PRE || context.isNeedsNewLine() && context.getWidth() <= avail)
- return;
- context.setEndsOnNL(false);
- String currentString = context.getStartSubstring();
- int left = 0;
- int right = getStrRight(currentString,left+1);
- int lastWrap = 0;
- int graphicsLength = 0;
- int lastGraphicsLength = 0;
- for (; right > 0 && graphicsLength <= avail; right =getStrRight(currentString,left+1))
- {
- lastGraphicsLength = graphicsLength;
- graphicsLength += c.getTextRenderer().getWidth(c.getFontContext(), font, currentString.substring(left, right));
- lastWrap = left;
- left = right;
- }
- if (graphicsLength <= avail)
- {
- lastWrap = left;
- lastGraphicsLength = graphicsLength;
- graphicsLength += c.getTextRenderer().getWidth(c.getFontContext(), font, currentString.substring(left));
- }
- if (graphicsLength <= avail)
- {
- context.setWidth(graphicsLength);
- context.setEnd(context.getMaster().length());
- return;
- }
- context.setNeedsNewLine(true);
- if (lastWrap != 0)
- {
- context.setEnd(context.getStart() + lastWrap);
- context.setWidth(lastGraphicsLength);
- } else
- {
- if (left == 0)
- left = currentString.length();
- context.setEnd(context.getStart() + left);
- context.setUnbreakable(true);
- if (left == currentString.length())
- context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
- else
- context.setWidth(graphicsLength);
- }
- }
- public static BreakIterator getWordStream(String s) {
- BreakIterator i = BreakIterator.getWordInstance();
- i.setText(s);
- return i;
- }
- /**
- 判断是否是中文
- @param c
- @return
- */
- private static boolean isChinses(char c){
- Character.UnicodeBlock ub=Character.UnicodeBlock.of©;
- if(ub==Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
- || ub==Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
- || ub==Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
- || ub==Character.UnicodeBlock.GENERAL_PUNCTUATION
- || ub==Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
- || ub==Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS ){
- return true;
- }
- return false;
- }
- /**
- 替换原先本类中所以获取right的方法
- int right = getStrRight(currentString,left+1);
- @param s
- @param left
- @return
- */
- private static int getStrRight(String s,int left){
- if(left>=s.length())
- return -1;
- char[] ch=s.toCharArray();
- for(int i=left;i<ch.length;i++){
- if(isChinses(ch[i]) || ‘\0’==ch[i]){
- return i==0?i+1:i;
- }
- }
- return -1;
- }
- }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
至于怎么修改源码,请自行百度,下方提供已经修改好的jar。
修改好后的jar:http://download.csdn.net/download/weixin_36795183/9983888
四、web查看
现在生成了pdf,那么我们咋么在前端更好的展现pdf 呢,在这里我们就要用到pdfjs来帮助我们展示pdf
下载好pdf.JS
http://download.csdn.net/download/weixin_36795183/9983904
`部署完成
好了 我们可应用viewer.html进行展示
在viewer中引入正确的引导。在这里我们应用base64进行显示。
在viewer中写入下面js。根据自己的环境进行修改。这里应用的是play框架。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
后台
byte[] bb=(pdf的流)
返回com.lowagie.text.pdf.codec.Base64.encodeBytes(bb)
1
2
3
下边的截图是控制展示的pdf的样式
到此之后 我们的生成和查看就实现了。而且是我们可控的。
五、显示签章
但是我们会发现 有签名的话 会不显示,这里我们要改一下
将pdf.js源码下载后,在build/pdf.worker.js文件中找到如下图所示的代码段
将this.setFlags(AnnotationFlag.HIDDEN);注释掉就会显示电子签章,反之不显示。
————————————————
版权声明:本文为CSDN博主「天才之上」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36795183/article/details/78018983
Html字符串生成pdf的方法 支持中文及中文换行 可行demo和jar相关推荐
- java pdf 中文_java-pdf-itext 生成pdf 文档(支持中文字体)
java-pdf-itext 生成pdf 文档(支持中文字体) itext 版本:2.1.7 package com.demo.preview; import java.io.ByteArrayOut ...
- java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片
java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片 重要说明: 1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严格: 2.中 ...
- TCPDF生成PDF文件方法教程说明
TCPDF生成PDF文件方法教程说明 TCPDF下载: composer: 在packagist中所搜tcpdf (https://packagist.org/packages/tecnickcom/ ...
- PHP中使用mpdf导出PDF文件以及生成PDF的方法
电子书内容介绍了关于PHP.核心技术.实践方面的内容,目前豆瓣.亚马逊.当当.京东等电子书综合评分为:7.1 PHP中使用mpdf 导出PDF文件的实现方法 mPDF是一个很强大的PDF生成库,能基本 ...
- 将Python字符串生成PDF
笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF.比如,需要把Python字符串'这是测试文件'生成为PDF, 该PDF中含有文字'这是测试文件'. 经过一番检索,笔者决定 ...
- 生成html_听说你不会用Python将字符串生成PDF?来,我教你!
这是恋习Python推荐的第118篇好文 来源:Python爬虫与算法 作者:jclian 笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF.比如,需要把Python字 ...
- Itext 将html 字符串生成PDF 方法
项目需求 1.实现将html 内容(含中文) 生成pdf 2.将现有的png格式图片 合入 pdf 中的特定位置 3.将base64 编码的图腾 合入 pdf 中的特定位置 package cn.te ...
- 根据html改为ftl模板生成pdf文件,支持中文及换行
这里demo用的maven来管理项目,pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...
- php压缩ttf文件_TCPDF PHP生成PDF文档支持ttf字体
TCPDF是一个用于快速生成PDF文件的PHP5函数包.TCPDF基于FPDF进行扩展和改进.支持UTF-8,Unicode,支持ttf字体,HTML和XHTML.在基于PHP开发的Web应用中,使用 ...
最新文章
- 10月份机房技术指标
- html5视频播放事件相关
- 【今日CS 视觉论文速览】 24 Dec 2018
- 首个实时单目3D目标检测算法:RTM3D,代码将开源
- 扒一扒9.3阅兵直播如何采用虚拟现实技术
- 波轮全自动洗衣机分解与典型部件拆装技巧
- 古体字与简体字对照表_简体字与繁体字对照表汇总
- putty 配色方案分享
- springboot 自定义starter
- Qt高质量的开源项目合集
- ATC系统QNH高度修正(AirNet川大)
- val.substring is not a function
- JRtplib开发笔记(二):JRtplib库编译、示例演示
- 【博弈论】博弈论入门笔记(四类基础博弈+SG函数)
- Linux期末考试复习大纲
- 1127. ZigZagging on a Tree (30)
- 卷积云神经网络_卷积神经网络
- 学习MRI成像的螺旋桨填充
- 向量距离、随机变量相关性与概率分布的差异度量
- excel报表导入失败问题记录