中文换行修改好后的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,添加中文识别。

  1. // Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
  2. // Jad home page: http://kpdus.tripod.com/jad.html
  3. // Decompiler options: packimports(3) fieldsfirst ansi space
  4. // Source File Name: Breaker.java
  5. package org.xhtmlrenderer.layout;
  6. import java.text.BreakIterator;
  7. import org.xhtmlrenderer.css.constants.IdentValue;
  8. import org.xhtmlrenderer.css.style.CalculatedStyle;
  9. import org.xhtmlrenderer.extend.TextRenderer;
  10. // Referenced classes of package org.xhtmlrenderer.layout:
  11. // LineBreakContext, LayoutContext
  12. public class Breaker
  13. {
  14. public Breaker()
  15. {
  16. }
  17. public static void breakFirstLetter(LayoutContext c, LineBreakContext context, int avail, CalculatedStyle style)
  18. {
  19. org.xhtmlrenderer.render.FSFont font = style.getFSFont©;
  20. context.setEnd(getFirstLetterEnd(context.getMaster(), context.getStart()));
  21. context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
  22. if (context.getWidth() > avail)
  23. {
  24. context.setNeedsNewLine(true);
  25. context.setUnbreakable(true);
  26. }
  27. }
  28. private static int getFirstLetterEnd(String text, int start)
  29. {
  30. int i = start;
  31. do
  32. {
  33. if (i >= text.length())
  34. break;
  35. char c = text.charAt(i);
  36. int type = Character.getType©;
  37. if (type != 21 && type != 22 && type != 29 && type != 30 && type != 24)
  38. break;
  39. i++;
  40. } while (true);
  41. if (i < text.length())
  42. i++;
  43. return i;
  44. }
  45. public static void breakText(LayoutContext c, LineBreakContext context, int avail, CalculatedStyle style)
  46. {
  47. org.xhtmlrenderer.render.FSFont font = style.getFSFont©;
  48. IdentValue whitespace = style.getWhitespace();
  49. if (whitespace == IdentValue.NOWRAP)
  50. {
  51. context.setEnd(context.getLast());
  52. context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
  53. return;
  54. }
  55. if (whitespace == IdentValue.PRE || whitespace == IdentValue.PRE_WRAP || whitespace == IdentValue.PRE_LINE)
  56. {
  57. int n = context.getStartSubstring().indexOf("\n");
  58. if (n > -1)
  59. {
  60. context.setEnd(context.getStart() + n + 1);
  61. context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
  62. context.setNeedsNewLine(true);
  63. context.setEndsOnNL(true);
  64. } else
  65. if (whitespace == IdentValue.PRE)
  66. {
  67. context.setEnd(context.getLast());
  68. context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
  69. }
  70. }
  71. if (whitespace == IdentValue.PRE || context.isNeedsNewLine() && context.getWidth() <= avail)
  72. return;
  73. context.setEndsOnNL(false);
  74. String currentString = context.getStartSubstring();
  75. int left = 0;
  76. int right = getStrRight(currentString,left+1);
  77. int lastWrap = 0;
  78. int graphicsLength = 0;
  79. int lastGraphicsLength = 0;
  80. for (; right > 0 && graphicsLength <= avail; right =getStrRight(currentString,left+1))
  81. {
  82. lastGraphicsLength = graphicsLength;
  83. graphicsLength += c.getTextRenderer().getWidth(c.getFontContext(), font, currentString.substring(left, right));
  84. lastWrap = left;
  85. left = right;
  86. }
  87. if (graphicsLength <= avail)
  88. {
  89. lastWrap = left;
  90. lastGraphicsLength = graphicsLength;
  91. graphicsLength += c.getTextRenderer().getWidth(c.getFontContext(), font, currentString.substring(left));
  92. }
  93. if (graphicsLength <= avail)
  94. {
  95. context.setWidth(graphicsLength);
  96. context.setEnd(context.getMaster().length());
  97. return;
  98. }
  99. context.setNeedsNewLine(true);
  100. if (lastWrap != 0)
  101. {
  102. context.setEnd(context.getStart() + lastWrap);
  103. context.setWidth(lastGraphicsLength);
  104. } else
  105. {
  106. if (left == 0)
  107. left = currentString.length();
  108. context.setEnd(context.getStart() + left);
  109. context.setUnbreakable(true);
  110. if (left == currentString.length())
  111. context.setWidth(c.getTextRenderer().getWidth(c.getFontContext(), font, context.getCalculatedSubstring()));
  112. else
  113. context.setWidth(graphicsLength);
  114. }
  115. }
  116. public static BreakIterator getWordStream(String s) {
  117. BreakIterator i = BreakIterator.getWordInstance();
  118. i.setText(s);
  119. return i;
  120. }
  121. /**
    • 判断是否是中文
    • @param c
    • @return
  122. */
  123. private static boolean isChinses(char c){
  124. Character.UnicodeBlock ub=Character.UnicodeBlock.of©;
  125. if(ub==Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
  126. || ub==Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
  127. || ub==Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
  128. || ub==Character.UnicodeBlock.GENERAL_PUNCTUATION
  129. || ub==Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
  130. || ub==Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS ){
  131. return true;
  132. }
  133. return false;
  134. }
  135. /**
    • 替换原先本类中所以获取right的方法
    • int right = getStrRight(currentString,left+1);
    • @param s
    • @param left
    • @return
  136. */
  137. private static int getStrRight(String s,int left){
  138. if(left>=s.length())
  139. return -1;
  140. char[] ch=s.toCharArray();
  141. for(int i=left;i<ch.length;i++){
  142. if(isChinses(ch[i]) || ‘\0’==ch[i]){
  143. return i==0?i+1:i;
  144. }
  145. }
  146. return -1;
  147. }
  148. }
    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相关推荐

  1. java pdf 中文_java-pdf-itext 生成pdf 文档(支持中文字体)

    java-pdf-itext 生成pdf 文档(支持中文字体) itext 版本:2.1.7 package com.demo.preview; import java.io.ByteArrayOut ...

  2. java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片

    java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片 重要说明: 1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严格: 2.中 ...

  3. TCPDF生成PDF文件方法教程说明

    TCPDF生成PDF文件方法教程说明 TCPDF下载: composer: 在packagist中所搜tcpdf (https://packagist.org/packages/tecnickcom/ ...

  4. PHP中使用mpdf导出PDF文件以及生成PDF的方法

    电子书内容介绍了关于PHP.核心技术.实践方面的内容,目前豆瓣.亚马逊.当当.京东等电子书综合评分为:7.1 PHP中使用mpdf 导出PDF文件的实现方法 mPDF是一个很强大的PDF生成库,能基本 ...

  5. 将Python字符串生成PDF

    笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF.比如,需要把Python字符串'这是测试文件'生成为PDF, 该PDF中含有文字'这是测试文件'. 经过一番检索,笔者决定 ...

  6. 生成html_听说你不会用Python将字符串生成PDF?来,我教你!

    这是恋习Python推荐的第118篇好文 来源:Python爬虫与算法 作者:jclian   笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF.比如,需要把Python字 ...

  7. Itext 将html 字符串生成PDF 方法

    项目需求 1.实现将html 内容(含中文) 生成pdf 2.将现有的png格式图片 合入 pdf 中的特定位置 3.将base64 编码的图腾 合入 pdf 中的特定位置 package cn.te ...

  8. 根据html改为ftl模板生成pdf文件,支持中文及换行

    这里demo用的maven来管理项目,pom.xml如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns: ...

  9. php压缩ttf文件_TCPDF  PHP生成PDF文档支持ttf字体

    TCPDF是一个用于快速生成PDF文件的PHP5函数包.TCPDF基于FPDF进行扩展和改进.支持UTF-8,Unicode,支持ttf字体,HTML和XHTML.在基于PHP开发的Web应用中,使用 ...

最新文章

  1. 10月份机房技术指标
  2. html5视频播放事件相关
  3. 【今日CS 视觉论文速览】 24 Dec 2018
  4. 首个实时单目3D目标检测算法:RTM3D,代码将开源
  5. 扒一扒9.3阅兵直播如何采用虚拟现实技术
  6. 波轮全自动洗衣机分解与典型部件拆装技巧
  7. 古体字与简体字对照表_简体字与繁体字对照表汇总
  8. putty 配色方案分享
  9. springboot 自定义starter
  10. Qt高质量的开源项目合集
  11. ATC系统QNH高度修正(AirNet川大)
  12. val.substring is not a function
  13. JRtplib开发笔记(二):JRtplib库编译、示例演示
  14. 【博弈论】博弈论入门笔记(四类基础博弈+SG函数)
  15. Linux期末考试复习大纲
  16. 1127. ZigZagging on a Tree (30)
  17. 卷积云神经网络_卷积神经网络
  18. 学习MRI成像的螺旋桨填充
  19. 向量距离、随机变量相关性与概率分布的差异度量
  20. excel报表导入失败问题记录

热门文章

  1. c++中exit()函数
  2. 大数据毕业设计_计算机专业如何才能更好的完成毕业设计呢?
  3. MySQL 的查询优化
  4. PCB设计中地的分类及含义
  5. Jenkins之自动进行360加固
  6. 模电——磁珠的前世今生
  7. KGC的衡量指标(MR、MRR、Hits@n)
  8. xcode6 关于iphone6、iphone6plus适配(一)
  9. 面试笔试题中的LRU算法及其缺页次数替换
  10. java改变数据库配置文件信息_JAVA应用修改数据库链接信息一般在哪个配置文件中?...