当前位置: 代码迷 >> 综合 >> ITex Chunk, Phrase Paragraph。
  详细解决方案

ITex Chunk, Phrase Paragraph。

热度:61   发布时间:2023-12-21 19:51:23.0

IText中有三个处理text的类com.lowagie.text.Chunk,com.lowagie.text.Phrase,com.lowagie.text.Paragraph。

它们之间有什么区别呢?

 

 

Chunk

 

Chunk是IText最小的文本编辑单位。不能再拆分更小的单元。其他高级的文本对象都是基于Chunk的。请看下图

(注此图,来源自http://www.cnblogs.com/LifelongLearning/archive/2011/03/30/2000072.html)

 

 

Java代码  
  1. package org.study.itext.text;  
  2.   
  3. import java.awt.Color;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6.   
  7. import com.lowagie.text.Chunk;  
  8. import com.lowagie.text.Document;  
  9. import com.lowagie.text.DocumentException;  
  10. import com.lowagie.text.Font;  
  11. import com.lowagie.text.pdf.BaseFont;  
  12. import com.lowagie.text.pdf.PdfWriter;  
  13. /** 
  14.  * @blog http://reymont.iteye.com/ 
  15.  * @author reymont.li 
  16.  * @version create time:2011-7-14 上午11:49:01 
  17.  */  
  18. public class ChunkTest {  
  19.     public static void main(String[] args) {  
  20.         Document document = new Document();  
  21.         try {  
  22.             PdfWriter.getInstance(document, new FileOutputStream(  
  23.                     "resource/ChunkTest.pdf"));  
  24.             document.open();  
  25.   
  26.             BaseFont songbfChinese = BaseFont.createFont("resource/STSONG.TTF",  
  27.                     BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  28.             Font songFont = new Font(songbfChinese, 18, Font.UNDERLINE);  
  29.             Chunk love = new Chunk("我们的爱", songFont);  
  30.             love.setTextRise(10);  
  31.             love.setBackground(Color.CYAN);  
  32.   
  33.             BaseFont xingkabfChinese = BaseFont.createFont(  
  34.                     "resource/STXINGKA.TTF", BaseFont.IDENTITY_H,  
  35.                     BaseFont.EMBEDDED);  
  36.             Font xingkaFont = new Font(xingkabfChinese, 18, Font.ITALIC);  
  37.             Chunk simple = new Chunk("简单", xingkaFont);  
  38.             simple.setBackground(Color.BLUE);  
  39.             simple.setTextRise(-10);  
  40.   
  41.             BaseFont kaibfChinese = BaseFont.createFont("resource/STKAITI.TTF",  
  42.                     BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  43.             Font kaiFont = new Font(kaibfChinese, 18, Font.BOLD);  
  44.             Chunk song = new Chunk("如歌", kaiFont);  
  45.             song.setBackground(Color.RED);  
  46.   
  47.             document.add(love);  
  48.             document.add(simple);  
  49.             document.add(song);  
  50.   
  51.         } catch (DocumentException de) {  
  52.             System.err.println(de.getMessage());  
  53.         } catch (IOException ioe) {  
  54.             System.err.println(ioe.getMessage());  
  55.         }  
  56.         document.close();  
  57.     }  
  58. }  
 

生成的文本为

 

 

 

在水平方向,Chunk的字符满一行,就会从头开始。请注意,这是从头开始,而不是另起一行。对于Chunk来说,行间距默认为0,那么当文档中只有Chunk时,这些字符永远只会出现再第一行。

 

Java代码  
  1. package org.study.itext.text;  
  2.   
  3. import java.awt.Color;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6.   
  7. import com.lowagie.text.Chunk;  
  8. import com.lowagie.text.Document;  
  9. import com.lowagie.text.DocumentException;  
  10. import com.lowagie.text.Font;  
  11. import com.lowagie.text.pdf.BaseFont;  
  12. import com.lowagie.text.pdf.PdfWriter;  
  13. /** 
  14.  * @blog http://reymont.iteye.com/ 
  15.  * @author reymont.li 
  16.  * @version create time:2011-7-14 上午11:49:14 
  17.  */  
  18. public class ChunkTest2 {  
  19.     public static void main(String[] args) {  
  20.         Document document = new Document();  
  21.         try {  
  22.             PdfWriter.getInstance(document, new FileOutputStream(  
  23.                     "resource/ChunkTest2.pdf"));  
  24.             document.open();  
  25.   
  26.             BaseFont songbfChinese = BaseFont.createFont("resource/STSONG.TTF",  
  27.                     BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  28.             Font songFont = new Font(songbfChinese, 18, Font.UNDERLINE);  
  29.             Chunk love = new Chunk("我们的爱", songFont);  
  30.             love.setTextRise(10);  
  31.             love.setBackground(Color.CYAN);  
  32.   
  33.             BaseFont xingkabfChinese = BaseFont.createFont(  
  34.                     "resource/STXINGKA.TTF", BaseFont.IDENTITY_H,  
  35.                     BaseFont.EMBEDDED);  
  36.             Font xingkaFont = new Font(xingkabfChinese, 18, Font.ITALIC);  
  37.             Chunk simple = new Chunk("简单", xingkaFont);  
  38.             simple.setBackground(Color.BLUE);  
  39.             simple.setTextRise(-10);  
  40.   
  41.             BaseFont kaibfChinese = BaseFont.createFont("resource/STKAITI.TTF",  
  42.                     BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  43.             Font kaiFont = new Font(kaibfChinese, 18, Font.BOLD);  
  44.             Chunk song = new Chunk("如歌", kaiFont);  
  45.             song.setBackground(Color.RED);  
  46.             for (int i = 0; i < 10; i++) {  
  47.                 document.add(love);  
  48.                 document.add(simple);  
  49.                 document.add(song);  
  50.             }  
  51.         } catch (DocumentException de) {  
  52.             System.err.println(de.getMessage());  
  53.         } catch (IOException ioe) {  
  54.             System.err.println(ioe.getMessage());  
  55.         }  
  56.         document.close();  
  57.     }  
  58. }  
 

生成的文档为:

 

可以看到后面的字符串覆盖了前面的字符串。怎么才能解决这个问题呢?

 


Phrase

我们可以将Chunk当成固定的块,Phrase当成由Chunk组成的字符串。让我们做一些小改动。

 

Java代码  
  1. package org.study.itext.text;  
  2.   
  3. import java.awt.Color;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6.   
  7. import com.lowagie.text.Chunk;  
  8. import com.lowagie.text.Document;  
  9. import com.lowagie.text.DocumentException;  
  10. import com.lowagie.text.Font;  
  11. import com.lowagie.text.Phrase;  
  12. import com.lowagie.text.pdf.BaseFont;  
  13. import com.lowagie.text.pdf.PdfWriter;  
  14. /** 
  15.  * @blog http://reymont.iteye.com/ 
  16.  * @author reymont.li 
  17.  * @version create time:2011-7-14 上午11:49:24 
  18.  */  
  19. public class PhraseTest {  
  20.     public static void main(String[] args) {  
  21.         Document document = new Document();  
  22.         try {  
  23.             PdfWriter.getInstance(document, new FileOutputStream(  
  24.                     "resource/PhraseTest.pdf"));  
  25.             document.open();  
  26.   
  27.             BaseFont songbfChinese = BaseFont.createFont("resource/STSONG.TTF",  
  28.                     BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  29.             Font songFont = new Font(songbfChinese, 18, Font.UNDERLINE);  
  30.             Chunk love = new Chunk("我们的爱", songFont);  
  31.             love.setTextRise(10);  
  32.             love.setBackground(Color.CYAN);  
  33.   
  34.             BaseFont xingkabfChinese = BaseFont.createFont(  
  35.                     "resource/STXINGKA.TTF", BaseFont.IDENTITY_H,  
  36.                     BaseFont.EMBEDDED);  
  37.             Font xingkaFont = new Font(xingkabfChinese, 18, Font.ITALIC);  
  38.             Chunk simple = new Chunk("简单", xingkaFont);  
  39.             simple.setBackground(Color.BLUE);  
  40.             simple.setTextRise(-10);  
  41.   
  42.             BaseFont kaibfChinese = BaseFont.createFont("resource/STKAITI.TTF",  
  43.                     BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  44.             Font kaiFont = new Font(kaibfChinese, 18, Font.BOLD);  
  45.             Chunk song = new Chunk("如歌", kaiFont);  
  46.             song.setBackground(Color.RED);  
  47.   
  48.               
  49.               
  50.             Phrase phrase = new Phrase(30);  
  51.             phrase.add(love);  
  52.             phrase.add(simple);  
  53.             phrase.add(song);  
  54.             for (int i = 0; i < 10; i++)  
  55.                 document.add(phrase);  
  56.             document.add(Chunk.NEWLINE);  
  57.             document.add(phrase);  
  58.             phrase.add("\n");  
  59.             for (int i = 0; i < 3; i++) {  
  60.                 document.add(phrase);  
  61.             }  
  62.   
  63.         } catch (DocumentException de) {  
  64.             System.err.println(de.getMessage());  
  65.         } catch (IOException ioe) {  
  66.             System.err.println(ioe.getMessage());  
  67.         }  
  68.         document.close();  
  69.     }  
  70. }  

 Document添加了phrase。这样,Phrase就会自动换行。

 

还有两种方式也可以换行 。

 

document.add(Chunk.NEWLINE);

phrase.add("\n");

 

 

 

貌似这样就解决了字符串换行的问题,但这些都要写一些额外的代码,有什么类封装这些动作呢?

 

 

Paragraph

 

Paragraph继承自Phase。

Java代码  
  1. package org.study.itext.text;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5.   
  6. import com.lowagie.text.Chunk;  
  7. import com.lowagie.text.Document;  
  8. import com.lowagie.text.DocumentException;  
  9. import com.lowagie.text.Element;  
  10. import com.lowagie.text.Font;  
  11. import com.lowagie.text.Paragraph;  
  12. import com.lowagie.text.Phrase;  
  13. import com.lowagie.text.pdf.BaseFont;  
  14. import com.lowagie.text.pdf.PdfWriter;  
  15. /** 
  16.  * @blog http://reymont.iteye.com/ 
  17.  * @author reymont.li 
  18.  * @version create time:2011-7-14 上午11:49:18 
  19.  */  
  20. public class ParagraphTest {  
  21.   
  22.     public static void main(String[] args) {  
  23.         Document document = new Document();  
  24.         try {  
  25.             PdfWriter.getInstance(  
  26.                     document,  
  27.                     new FileOutputStream("resource/ParagraphTest.pdf"));  
  28.             document.open();  
  29.             String text = "我们的爱简单如歌";  
  30.             Phrase phrase1 = new Phrase(text);  
  31.             Phrase phrase2 = new Phrase(new Chunk(text, new Font(  
  32.                     Font.TIMES_ROMAN)));  
  33.               
  34.             BaseFont songbfChinese = BaseFont.createFont("resource/STSONG.TTF",  
  35.                     BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
  36.             Font font = new Font(songbfChinese, 18, Font.NORMAL);  
  37.               
  38.             Phrase phrase3 = new Phrase(text, font);  
  39.             Paragraph paragraph = new Paragraph();  
  40.             paragraph.add(phrase1);  
  41.             paragraph.add(phrase2);  
  42.             paragraph.add(phrase3);  
  43.             document.add(paragraph);  
  44.             document.add(paragraph);  
  45.             paragraph.setAlignment(Element.ALIGN_LEFT);  
  46.             document.add(paragraph);  
  47.             paragraph.setAlignment(Element.ALIGN_CENTER);  
  48.             document.add(paragraph);  
  49.             paragraph.setAlignment(Element.ALIGN_RIGHT);  
  50.                       
  51.             document.add(paragraph);  
  52.             paragraph.setAlignment(Element.ALIGN_JUSTIFIED);  
  53.             document.add(paragraph);  
  54.             paragraph.setSpacingBefore(10);  
  55.             document.add(paragraph);  
  56.             paragraph.setSpacingBefore(0);  
  57.             paragraph.setSpacingAfter(10);  
  58.             document.add(paragraph);  
  59.             paragraph.setIndentationLeft(20);  
  60.             document.add(paragraph);  
  61.             paragraph.setIndentationRight(20);  
  62.             document.add(paragraph);  
  63.         } catch (DocumentException de) {  
  64.             System.err.println(de.getMessage());  
  65.         } catch (IOException ioe) {  
  66.             System.err.println(ioe.getMessage());  
  67.         }  
  68.   
  69.         document.close();  
  70.     }  
  71. }  

 

每段文字上面和下面的空间,可使用setSpacingBefore() 和setSpacingAfter() 来指定。

 

每段文字的缩进可使用setIndentationLeft()和setIndentationRight()。

 

 

以下为个人模仿:


package test;


import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;


import org.apache.poi.hwpf.extractor.WordExtractor;


import com.lowagie.text.Cell;
import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;


public class Test {



public static void createDocContext(String file) throws DocumentException, 
IOException { 
// 设置纸张大小 
Document document = new Document(PageSize.A4.rotate());
// 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中 
RtfWriter2.getInstance(document, new FileOutputStream(file)); 
document.open(); 
// 设置中文字体 
// BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", 
// "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); 
BaseFont bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 标题字体风格 
Font titleFont = new Font(bfChinese, 26, Font.BOLD); 


//标签字体样式
Font labelFont = new Font(bfChinese,15,Font.BOLD);

// 正文字体风格 
Font contextFont = new Font(bfChinese, 14, Font.NORMAL); 
Font contextBoldFont = new Font(bfChinese, 14, Font.BOLD); 

// 设置标题格式对齐方式 
Paragraph title = new Paragraph("江苏中烟工业系统月度快报说明",titleFont); 
title.setAlignment(Element.ALIGN_CENTER); 
document.add(title); 
// 设置日期


Paragraph title2 = new Paragraph("(二Ο一四年五月)",new Font(bfChinese,16,Font.BOLD));
title2.setAlignment(Element.ALIGN_CENTER);
document.add(title2);
document.add(new Paragraph(""));


//标签1
Paragraph label = new Paragraph("    一、全系统实现税利情况",labelFont);
label.setLeading(30);
label.setAlignment(Element.ALIGN_LEFT);
document.add(label);
 
Chunk _label = new Chunk("    工业公司本级:",contextBoldFont);
Chunk _context = new Chunk("5月份实现税利35.75亿元,同比29.62亿元增长20.69%," +
"其中实现利润8.15亿元,同比7.52亿元上升8.39%。1-5月份累计实现税利215.77亿元, 同比197.84亿元增长9.06%," +
"其中累计实现利润44.77亿元,同比43.13亿元增长3.78%。",contextFont);
// Phrase _l_c = new Phrase();
Paragraph _l_c = new Paragraph();
_l_c.setLeading(30);
_l_c.add(_label);
_l_c.add(_context);
document.add(_l_c);


_label = new Chunk("    全系统:",contextBoldFont);
_context = new Chunk("5月份实现税利35.98亿元,同比29.75亿元增长20.94%,其中实现利润8.29亿元,同比7.6亿元增长9.05%。1-5月份累计实现税利216.37亿元," +
"同比198.54亿元增长8.98%,其中实现利润45.27亿元,同比43.69亿元增长3.63%。",contextFont);
_l_c = new Paragraph();
_l_c.setLeading(30);
_l_c.add(_label);
_l_c.add(_context);
document.add(_l_c);


//标签1
label = new Paragraph("    二、卷烟工业企业产量、销量及实现税利情况",labelFont);
label.setLeading(30);
label.setAlignment(Element.ALIGN_LEFT);
document.add(label);
 
_l_c = new Paragraph("    1、5月份生产卷烟17.5万箱,同比15.56万箱增加1.9万箱,增长12.44%。1-5月份累计生产卷烟89.08万箱,同比85.56万箱增加3.5万箱,增长4.1%。",contextFont);
_l_c.setLeading(30);
document.add(_l_c);

_l_c = new Paragraph("    2、5月份自产卷烟销售17.55万箱,同比15.83万箱增加1.72万箱,增长10.86%。1-5月份累计自产卷烟销售94.68万箱,同比90.87万箱增加3.81万箱,增长4.19%。",contextFont);
_l_c.setLeading(30);
document.add(_l_c);

_l_c = new Paragraph("    3、5月份自产卷烟销售额38.52亿元,同比32.64亿元增长18.01%。1-5月份累计自产卷烟销售额233.21亿元,同比212.77亿元增长9.6%。",contextFont);
_l_c.setLeading(30);
document.add(_l_c);

_l_c = new Paragraph("    4、5月份自产卷烟销售成本7.88亿元,同比6.49亿元增长21.52%。1-5月份累计自产卷烟销售成本43.29亿元,同比38.35亿元增长12.87%。",contextFont);
_l_c.setLeading(30);
document.add(_l_c);

_l_c = new Paragraph("    4、5月份自产卷烟销售成本7.88亿元,同比6.49亿元增长21.52%。1-5月份累计自产卷烟销售成本43.29亿元,同比38.35亿元增长12.87%。",contextFont);
_l_c.setLeading(30);
document.add(_l_c);

_l_c = new Paragraph("    6、1-5月份卷烟累计税利增加17.93亿元,其中销量增加3.81万箱,增加税利8.29亿元,单箱税利结构提升1017元,增加税利9.64亿元。",contextFont);
_l_c.setLeading(30);
document.add(_l_c);


label = new Paragraph("    三、工业公司本级成本费用情况",labelFont);
label.setLeading(30);
label.setAlignment(Element.ALIGN_LEFT);
document.add(label);
_l_c = new Paragraph();
_l_c.setLeading(30);
_context = new Chunk("    1-5月份累计期间费用61628万元,同比62377万元下降1.2%。其中:",contextFont);
_label = new Chunk("营业费用",contextBoldFont);
_l_c.add(_context);
_l_c.add(_label);
_context = new Chunk("21357万元,同比18877万元上升13.14%,",contextFont);
_label = new Chunk("管理费用",contextBoldFont);
_l_c.add(_context);
_l_c.add(_label);
_context = new Chunk("56992万元,同比61123万元下降6.76%。综合两大费用来看总体减少1651万,下降2.06%。其中由于工资费用增长1600万,实则其他费用的下降影响在3200多万。重点费用的使用情况:其中宣传促销费下降70%,车辆运行费用下降30%,业务招待费下降82.29%,本月由于派驻阿根廷人员差费报销,涉外费用是上升的。",contextFont);
_l_c.add(_context);
document.add(_l_c);














document.close(); 




public static void main(String[] args) { 
String file = "d:/demo1.doc"; 
try { 
createDocContext(file); 
} catch (DocumentException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 



}

 

  相关解决方案