itext文本域自动换行_iText+Flying Saucer生成pdf文档,中文不显示和不自动换行问题...
一、重写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(c);
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(c);
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(c);
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(c);
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
if(isChinses(ch[i]) || '\0'==ch[i]){
return i==0?i+1:i;
}
}
return -1;
}
}
二,生成pdf,添加生成pdf所使用的字符集.注:这里字符集要和模板中使用的字符集一一致。 比如:java中使用宋体 renderer.getFontResolver().addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 那么html的body中样式必须加上 style='font-family:SimSun',要是使用其他字符生成pdf时候,中文就会不显示生成pdf 的
//生成pdf例子
public class MyPdf {
/**
* 使用flying sauce生成pdf
* @param htmlPath c:\\Users\\dfhc\\Desktop\\1015101900000000020.html
* @param savePDFPath c:\\Users\\dfhc\\Desktop\\ssPdf.pdf
* @throws Exception
*/
public static void createPDFByFly(String htmlPath,String savePDFPath) throws Exception{
// step 1
String inputFile = htmlPath;
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = savePDFPath;
// System.out.println(url);
// step 2
OutputStream os = null;
try {
os=new FileOutputStream(outputFile);
org.xhtmlrenderer.pdf.ITextRenderer renderer = new org.xhtmlrenderer.pdf.ITextRenderer();
// linux:
// fontResolver.addFont("/usr/share/fonts/TTF/ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.getFontResolver().addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
renderer.finishPDF();
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e.getMessage());
}finally{
if (os != null) {
try {
os.close();
} catch (IOException e) {
// ignore
}
}
}
}
public static void main(String[] args) {
try {
createPDFByFly("c:\\Users\\dfhc\\Desktop\\1000101900000000015.html", "c:\\Users\\dfhc\\Desktop\\1000101900000000015.pdf");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 三、设置pdf的页面大小模板页面中添加该样式:@page { size: 8.5in 11in; }这时候生成pdf页面正好是A4纸大小 四、所需的jar包http://download.csdn.net/detail/shiyuqiong/8343881,该核心jar是修改后的
itext文本域自动换行_iText+Flying Saucer生成pdf文档,中文不显示和不自动换行问题...相关推荐
- itext文本域自动换行_iText+Flying Saucer生成pdf文档,重写Breaker中文可以换行,但是英文单词会截断问题
网上有好多重新的Breaker的案例或者代码,但是如果其中涉及到英文,那么单词也会直接被拦腰截断,这不是我们想要的结果,我有重写了一下Breaker,完美解决这个问题,废话不多说,代码如下: pack ...
- qt 利用 HTML 生成PDF文档,不能显示jpg图片
利用 QPrinter 和html 生成 pdf文档 其中用html语句有显示图片的语句 但只能显示png格式的图片,不能显示jpg格式图片. 经过排查:语法,文件路径等都正确,最终在stack ov ...
- 使用Flying Saucer生成pdf
使用Flying Saucer生成pdf 实现思路: 利用FreeMarker编写HTML模板,通过Flying Saucer生成pdf. 一.maven添加依赖 本项目使用maven构建,基于spr ...
- Flying Saucer生成pdf报表
使用Flying Saucer生成pdf报表: 1.首先看一下Flying Saucer的官方介绍: https://github.com/flyingsaucerproject/flyingsauc ...
- flyingsaucer转换多个html,用 flying saucer 生成pdf文件 Css及html的问题
我用 flying saucer 生成PDF文件,因为要生成文章,而文章是由tinymce发布的.可能有些文章发布出去后格式有问题,比如说标签不规范,有的没有闭合. 这样 flying sauce ...
- freemark与flying saucer生成PDF
freemark与flying saucer生成PDF 1.导入flying saucer与freemark的包. 2.利用freemark生成html文件. 3.利用flying saucer进行p ...
- Java生成PDF文档 iText使用PDF模板一
最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...
- java pdf 首行缩进_java使用iText生成pdf文档的对齐方式
一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...
- 使用itext和JasperReports生成PDF文档
1>方法一Itext来实现生成文档这个pdf的文档 1.使用Itext来实现生成我都这个PDF的文档,代码如下 public static void main(String[] args) {t ...
最新文章
- Quill编辑器IOS下无法获取焦点的解决方法
- 【剑指Offer】28、数组中出现次数超过一半的数字
- 在水晶报表中实现任意选择指定字段显示-模板及C#升级版
- php登录注册demo,PHP实现登录功能DEMO
- ESP32彩屏成为HMI这条GAI最靓的仔--8月27日启明云端携手乐鑫为你共述ESP32时下最IN进阶玩法--以简驭繁,AI语音、彩屏尽显锋芒
- tomcat(3)连接器
- 1.three.js世界的4大要素
- POI生成Web版Word文件
- python迭代器与生成器_python的迭代器与生成器实例详解
- 智能一代云平台(六):移动开发之Ionic研究
- puppet之用户管理
- 自旋锁--Test and Set Clock机制分析
- 浅析指针(pointer)与引用(reference)
- 事件驱动和状态机模式在YARN中的使用
- ios苹果应用ipa一键签名工具_ios签名何以做到不越狱不上架也能安装ipa文件?
- linux打开pkg文件怎么打开,linux中怎么打开tar.rar.gz文件
- DDoS攻击--CC攻击防护详解(HTTP)
- 【社区图书馆】vue的生命周期
- 电视软件测试项目怎么做,LED_TV液晶电视软件测试用例.doc
- 大学C语言字符串题目,[转载]大学C语言考试题精选
热门文章
- 华为交换机dhcp获取不到_S7706交换机客户端无法通过DHCP获取地址问题
- 【爬虫实战】国家企业公示网-crawler爬虫抓取数据
- CS224n笔记——Subword Model(十二)
- R语言ARIMA-GARCH波动率模型预测股票市场苹果公司日收益率时间序列
- 怎样保留应届生身份?应届生的身份有多重要?
- nvm介绍及常用命令
- 暴雪不管的国服 链游要插手
- 果汁机器人传销_独家调查|“洋果汁治百病”?然健环球涉嫌传销大起底
- 10万行代码电商项目
- linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...