Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

操作PDF文件

Posted on 2009-05-30 23:38 啥都写点 阅读(997) 评论(1)  编辑  收藏 所属分类: J2SE
关键技术:
  • 一个Excel文档从大到小可以分成如下几个要素:文档、章节、小节、段落、表格、列表。
  • com.lowagie.text.Document表示PDF文档。必须为它创建一个PDF写入器,即com.lowagie.text.pdf.Pdfwriter对象,写入器的作用是将Document对象与目标文件关联起来。调用Document的open方法便打开与目标文件的连接;Document的add方法为文档添加章节。
  • com.lowagie.text.Chapter表示PDF文档中的章节。它的setTitle方法设置章节的标题;setNumberDepth方法设置小节的编号级别;add方法为小节中添加内容,可以是段落、表格、列表等。
  • com.lowagie.text.Paragraph表示PDF文档中的段落。可以指定段落的对齐方式、字体等属性。
  • com.lowagie.text.Table表示PDF文档中的表格。通过它的一系列set方法可以设置表格的样式,比如边框大小、颜色等;addCell方法为表格添加单元格,单元格是com.lowagie.text.Cell对象。
  • com.lowagie.text.List表示PDF文档中的列表。com.lowagie.text.ListItem表示列表中项。通过List的add方法将列表项添加到列表中。
  使用pdfbox的类库读取PDF文档的关键技术点如下:
  • org.pdfbox.pdfparser.PDFParser用于解析PDF文档,它的parse方法对PDF文件输入流进行解析;getPDDocument方法获得解析后得到的PDF文档对象,是一个org.pdfbox.pdmodel.PDDocument对象。
  • org.pdfbox.util.PDFTextStripper是分析PDF文档对象中文本的工具类,它的getText方法能够提取PDF文档对象中包含的文本。

package book.io;

import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.util.PDFTextStripper;

import com.lowagie.text.Cell;
import com.lowagie.text.Chapter;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.List;
import com.lowagie.text.ListItem;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Section;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;

/**
 * 很多应用程序要求动态生成 PDF 文档。这类应用程序包括银行生成用于电子邮件投递的客户报表,到读者购买特定图书章节并以 PDF 格式接收这些文档。例子罗列下去是很多的。在本文中,将使用 iText Java 库生成 PDF 文档,并引导您完成一个示例应用程序,以使您能够更好地理解和使用 iText。 
iText 是 Lowagie.com 站点(请参阅 参考资料)免费提供的 Java 库。iText 库的功能很强大,支持 HTML、RTF 和 XML 文档的生成,此外还能够生成 PDF 文档。可以从多种字体中选择文档中所使用的字体。同时,iText 的结构允许使用相同的代码生成以上任意类型的文档。
 * 
http://www.lowagie.com/iText/
 * iText API:近距离观察
com.lowagie.text.Document 是生成 PDF 的主要的类。它是需要使用的第一个类。一旦开始创建文档,将需要一个写入器向文档中写入内容。com.lowagie.text.pdf.PdfWriter 就是一个 PDF 写入器。下面列出了通常需要使用的类:
com.lowagie.text.Paragraph —— 这个类表示一个缩进的段落。 
com.lowagie.text.Chapter —— 这个类表示 PDF 文档中的章节。使用 Paragraph 作为题目并使用 int 作为章节号码来创建它。
com.lowagie.text.Font —— 这个类包含了全部的字体规范,例如字体、大小、样式和颜色。各种字体都在这个类中声明为静态常数。 
com.lowagie.text.List —— 这个类表示一个列表,按顺序包含许多 ListItems。
com.lowagie.text.Table —— 这个类表示包含单元格的表,单元格有序地排列在矩阵中。
 
*/
public class PDFFile {

    
/**
     * 写PDF文件,展示了PDF文档、章节、小节、字体、段落、表格、列表的使用
     * 最后展示如何使用写入中文。
     * 
@param fileName
     
*/
    
public void writePDF(String fileName) {
        File file 
= new File(fileName);
        FileOutputStream out 
= null;

        
try {
            
//(1)实例化文档对象
            
//第一个参数是页面大小。接下来的参数分别是左、右、上和下页边距。
            Document document = new Document(PageSize.A4, 50505050);

            
//(2)创建写入器
            
//第一个参数是对文档对象的引用,第二个参数是输出的文件,将out和document连接起来
            out = new FileOutputStream(file);
            PdfWriter writer 
= PdfWriter.getInstance(document, out);
            
//打开文档准备写入内容
            document.open();
            
            
//(3)下面创建章节对象
            
//首先创建段落对象,作为章节的标题。FontFactory用于指定段落的字体。
            Font font = FontFactory.getFont(FontFactory.HELVETICA, 
                    
18, Font.BOLDITALIC, new Color(00255));
            Paragraph chapter1_title 
= new Paragraph("Chapter 1",font);
            
//创建了一个章节对象,标题为"Chapter 1"
            Chapter chapter1 = new Chapter(chapter1_title, 1);
            
//将编号级别设为 0 就不会在页面上显示章节编号
            chapter1.setNumberDepth(0);
            
//(4)创建小节对象
            
//创建小节对象的标题
            font = FontFactory.getFont(FontFactory.HELVETICA, 16
                    Font.BOLD, 
new Color(25500));
            Paragraph section1_title1 
= new Paragraph("Section 1 of Chapter 1", font);
            
//创建一个小节对象,标题为"This is Section 1 in Chapter 1",属于chapter1。
            Section section1 = chapter1.addSection(section1_title1);
            
//(5)往小节中写文本内容
            Paragraph text = new Paragraph("This is the first text in section 1 of chapter 1.");
            section1.add(text);
            text 
= new Paragraph("Following is a 5×5 table:");
            section1.add(text);
            
            
//(6)往小节中写表格
            
//创建表格对象
            Table table = new Table(55);
            
//设置表格边框颜色
            table.setBorderColor(new Color(220255100));
            
//设置单元格的边距间隔等
            table.setPadding(1);
            table.setSpacing(
1);
            table.setBorderWidth(
1);
            
//单元格对象
            Cell cell = null;
            
//添加表头信息
            for (int colNum=0; colNum<5; colNum++){
                cell 
= new Cell("header-" + colNum);
                cell.setHeader(
true);
                table.addCell(cell);
            }
            table.endHeaders();
            
//添加表的内容
            for (int rowNum=1; rowNum<5; rowNum++){
                
for (int colNum=0; colNum<5; colNum++){
                    cell
= new Cell("value-" + rowNum + "-" + colNum);
                    table.addCell(cell);
                }
            }
            
//将表格对象添加到小节对象中
            section1.add(table); 
            
            
//(7)添加列表
            
// 列表包含一定数量的 ListItem。可以对列表进行编号,也可以不编号。
            
// 将第一个参数设置为 true 表明想创建一个进行编号的列表;
            
// 第二个参数设置为true表示列表采用字母进行编号,为false则用数字进行编号;
            
// 第三个参数为列表内容与编号之间的距离。
            List list = new List(truefalse20);
            ListItem item 
= new ListItem("First item of list;");
            list.add(item);
            item 
= new ListItem("Second item of list;");
            list.add(item);
            item 
= new ListItem("Third item of list.");
            list.add(item);
            
//将列表对象添加到小节对象中
            section1.add(list);
            
            
//(8)添加中文
            
//允许在PDF中写入中文,将字体文件放在classPath中。
            
//simfang.ttf是仿宋的字体文件
            BaseFont bfChinese = BaseFont.createFont("simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            
//中文大小为20,加粗
            font = new Font(bfChinese, 20, Font.BOLD);
            text 
= new Paragraph("PDF中文测试", font);
            section1.add(text);
            
            
//(9)将章节对象加入到文档中
            document.add(chapter1);
            
            
//(10)关闭文档
            document.close();
            System.out.println(
"PDF文件生成成功,PDF文件名:" + file.getAbsolutePath());
        } 
catch (DocumentException e) {
            System.out.println(
"PDF文件"+ file.getAbsolutePath() + "生成失败!" + e);
            e.printStackTrace();
        } 
catch (IOException ee) {
            System.out.println(
"PDF文件"+ file.getAbsolutePath() + "生成失败!" + ee);
            ee.printStackTrace();
        } 
finally {
            
if (out != null){
                
try {
                    
//关闭输出文件流
                    out.close();
                } 
catch (IOException e1) {
                }
            }
        }
    }
    
/**
     * 读PDF文件,使用了pdfbox开源项目,新的版本已经支持中文了。
     * 上www.pdfbox.org下载读PDF的jar包
     * 
@param fileName
     
*/
    
public void readPDF(String fileName) {
        File file 
= new File(fileName);
        FileInputStream in 
= null;
        
try {
            in 
= new FileInputStream(fileName);
            
//新建一个PDF解析器对象
            PDFParser parser = new PDFParser(in);
            
//对PDF文件进行解析
            parser.parse();
            
//获取解析后得到的PDF文档对象
            PDDocument pdfdocument = parser.getPDDocument();
            
//新建一个PDF文本剥离器
            PDFTextStripper stripper = new PDFTextStripper();
            
//从PDF文档对象中剥离文本
            String result = stripper.getText(pdfdocument);
            System.out.println(
"PDF文件" + file.getAbsolutePath() + "的文本内容如下:");
            System.out.println(result);
            
        } 
catch (Exception e) {
            System.out.println(
"读取PDF文件"+ file.getAbsolutePath() + "生失败!" + e);
            e.printStackTrace();
        } 
finally {
            
if (in != null){
                
try {
                    in.close();
                } 
catch (IOException e1) {
                }
            }
        }
    }
    
    
public static void main(String[] args) {
        PDFFile pdf 
= new PDFFile();
        String fileName 
= "C:/temp/tempPDF.pdf";
        pdf.writePDF(fileName);
        pdf.readPDF(fileName);
    }
}


                                                                                                       --    学海无涯
        

Feedback

# re: 操作PDF文件  回复  更多评论   

2012-05-12 10:06 by ly.wolf
stripper.getText(pdfdocument);
這裡提示錯誤:
"Object reference not set to an instance of an object."





ly-msn@msn.com

只有注册用户登录后才能发表评论。


网站导航: