一、重写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文档,中文不显示和不自动换行问题...相关推荐

  1. itext文本域自动换行_iText+Flying Saucer生成pdf文档,重写Breaker中文可以换行,但是英文单词会截断问题

    网上有好多重新的Breaker的案例或者代码,但是如果其中涉及到英文,那么单词也会直接被拦腰截断,这不是我们想要的结果,我有重写了一下Breaker,完美解决这个问题,废话不多说,代码如下: pack ...

  2. qt 利用 HTML 生成PDF文档,不能显示jpg图片

    利用 QPrinter 和html 生成 pdf文档 其中用html语句有显示图片的语句 但只能显示png格式的图片,不能显示jpg格式图片. 经过排查:语法,文件路径等都正确,最终在stack ov ...

  3. 使用Flying Saucer生成pdf

    使用Flying Saucer生成pdf 实现思路: 利用FreeMarker编写HTML模板,通过Flying Saucer生成pdf. 一.maven添加依赖 本项目使用maven构建,基于spr ...

  4. Flying Saucer生成pdf报表

    使用Flying Saucer生成pdf报表: 1.首先看一下Flying Saucer的官方介绍: https://github.com/flyingsaucerproject/flyingsauc ...

  5. flyingsaucer转换多个html,用 flying saucer 生成pdf文件 Css及html的问题

    我用  flying saucer  生成PDF文件,因为要生成文章,而文章是由tinymce发布的.可能有些文章发布出去后格式有问题,比如说标签不规范,有的没有闭合. 这样 flying sauce ...

  6. freemark与flying saucer生成PDF

    freemark与flying saucer生成PDF 1.导入flying saucer与freemark的包. 2.利用freemark生成html文件. 3.利用flying saucer进行p ...

  7. Java生成PDF文档 iText使用PDF模板一

    最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...

  8. java pdf 首行缩进_java使用iText生成pdf文档的对齐方式

    一.前言 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或 ...

  9. 使用itext和JasperReports生成PDF文档

    1>方法一Itext来实现生成文档这个pdf的文档 1.使用Itext来实现生成我都这个PDF的文档,代码如下 public static void main(String[] args) {t ...

最新文章

  1. Quill编辑器IOS下无法获取焦点的解决方法
  2. 【剑指Offer】28、数组中出现次数超过一半的数字
  3. 在水晶报表中实现任意选择指定字段显示-模板及C#升级版
  4. php登录注册demo,PHP实现登录功能DEMO
  5. ESP32彩屏成为HMI这条GAI最靓的仔--8月27日启明云端携手乐鑫为你共述ESP32时下最IN进阶玩法--以简驭繁,AI语音、彩屏尽显锋芒
  6. tomcat(3)连接器
  7. 1.three.js世界的4大要素
  8. POI生成Web版Word文件
  9. python迭代器与生成器_python的迭代器与生成器实例详解
  10. 智能一代云平台(六):移动开发之Ionic研究
  11. puppet之用户管理
  12. 自旋锁--Test and Set Clock机制分析
  13. 浅析指针(pointer)与引用(reference)
  14. 事件驱动和状态机模式在YARN中的使用
  15. ios苹果应用ipa一键签名工具_ios签名何以做到不越狱不上架也能安装ipa文件?
  16. linux打开pkg文件怎么打开,linux中怎么打开tar.rar.gz文件
  17. DDoS攻击--CC攻击防护详解(HTTP)
  18. 【社区图书馆】vue的生命周期
  19. 电视软件测试项目怎么做,LED_TV液晶电视软件测试用例.doc
  20. 大学C语言字符串题目,[转载]大学C语言考试题精选

热门文章

  1. 华为交换机dhcp获取不到_S7706交换机客户端无法通过DHCP获取地址问题
  2. 【爬虫实战】国家企业公示网-crawler爬虫抓取数据
  3. CS224n笔记——Subword Model(十二)
  4. R语言ARIMA-GARCH波动率模型预测股票市场苹果公司日收益率时间序列
  5. 怎样保留应届生身份?应届生的身份有多重要?
  6. nvm介绍及常用命令
  7. 暴雪不管的国服 链游要插手
  8. 果汁机器人传销_独家调查|“洋果汁治百病”?然健环球涉嫌传销大起底
  9. 10万行代码电商项目
  10. linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...