转 http://www.blogjava.net/sxyx2008/archive/2010/07/23/326890.html

轻松使用apache pdfbox将pdf文件生成图

近期在项目中使用到了大量的报表开发,需要将html页面中的表格内容导出到pdf word excel和图片,前三者都比较好实现。唯独后者生成图片使用ImageIo操作时生成的图片有点惨不忍睹。经过大量google后发现,pdfbox这个组件不错,可以将pdf文件轻松生成图片。这不问题解决了,但在使用过程中不然,受到了很多致命性的打击。pdfbox在处理中文pdf的时候就会表现的比较脆弱点。但对英文版的pdf导出图片,那是杠杠的。尽管这样,还是记录一下,毕竟这方面的资料很少。我几乎搜遍了整个google,baidu才搜集到那么一点点资料。这里跟大家分享下。         所依赖的JAR:         commons-logging-1.1.1.jar         fontbox-1.2.1.jar         pdfbox-1.2.1.jar         示例代码:

/**//*  * Licensed to the Apache Software Foundation (ASF) under one or more  * contributor license agreements.  See the NOTICE file distributed with  * this work for additional information regarding copyright ownership.  * The ASF licenses this file to You under the Apache License, Version 2.0  * (the "License"); you may not use this file except in compliance with  * the License.  You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ package com.future.pdfbox.image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; public class ExtractImages  {     public static void main(String[] args) throws IOException         PDDocument doc = PDDocument.load("F:\\1.pdf");         int pageCount = doc.getPageCount();          System.out.println(pageCount);          List pages = doc.getDocumentCatalog().getAllPages();          for(int i=;i<pages.size();i++){             PDPage page = (PDPage)pages.get(i);              BufferedImage image = page.convertToImage();              Iterator iter = ImageIO.getImageWritersBySuffix("jpg");              ImageWriter writer = (ImageWriter)iter.next();              File outFile = new File("C:/"+i+".jpg");              FileOutputStream out = new FileOutputStream(outFile);              ImageOutputStream outImage = ImageIO.createImageOutputStream(out);              writer.setOutput(outImage);              writer.write(new IIOImage(image,null,null));          }         doc.close();          System.out.println("over");      } }

使用PDFBox处理PDF文档http://www.cnblogs.com/hejycpu/archive/2009/01/19/1378380.html

1、使用PDFBox处理PDF文档

PDF全称Portable Document Format,是Adobe公司开发的电子文件格式。这种文件格式与操作系统平台无关,可以在Windows、Unix或Mac OS等操作系统上通用。

PDF文件格式将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。如果要抽取其中的文本信息,需要根据它的文件格式来进行解析。幸好目前已经有不少工具能帮助我们做这些事情。

2、PDFBox的下载

最常见的一种PDF文本抽取工具就是PDFBox了,访问网址http://sourceforge.net/projects/pdfbox/,进入如图7-1所示的下载界面。读者可以在该网页下载其最新的版本。本书采用的是PDFBox-0.7.3版本。PDFBox是一个开源的Java PDF库,这个库允许你访问PDF文件的各项信息。在接下来的例子中,将演示如何使用PDFBox提供的API,从一个PDF文件中提取出文本信息。

3、在Eclipse中配置

以下是在Eclipse中创建工程,并建立解析PDF文件的工具类的过程。

(1)在Eclipse的workspace中创建一个普通的Java工程:ch7。

(2)把下载的PDFBox-0.7.3.zip解压。

(3)进入external目录下,可以看到,这里包括了PDFBox所有用到的外部包。复制下面的Jar包到工程ch7的lib目录下(如还未建立lib目录,则先创建一个)。

l bcmail-jdk14-132.jar

l bcprov-jdk14-132.jar

l checkstyle-all-4.2.jar

l FontBox-0.1.0-dev.jar

l lucene-core-2.0.0.jar

然后再从PDFBox的lib目录下,复制PDFBox-0.7.3.jar到工程的lib目录下。

(4)在工程上单击右键,在弹出的快捷菜单中选择“Build Path->Config Build Path->Add Jars”命令,把工程lib目录下面的包都加入工程的Build Path。

4、使用PDFBox解析PDF内容

在刚刚创建的Eclipse工程中,创建一个ch7.pdfbox包,并创建一个PdfboxTest类。该类包含一个getText方法,用于从一个PDF中获取文本信息,其代码如下。

import java.io.BufferedWriter;             import java.io.FileInputStream;             import java.io.FileWriter;
            import org.pdfbox.pdfparser.PDFParser;             import org.pdfbox.util.PDFTextStripper;
            public class PdfParser {
               /**                * @param args                */                // TODO 自动生成方法存根
       public   static   void   main(String[]   args)   throws   Exception{                         FileInputStream   fis   =   new   FileInputStream("F:\\task\\lerman-atem2001.pdf");                         BufferedWriter writer = new BufferedWriter(new FileWriter("F:\\task\\pdf_change.txt"));                         PDFParser   p   =   new   PDFParser(fis);                         p.parse();                                 PDFTextStripper   ts   =   new   PDFTextStripper();                                 String   s   =   ts.getText(p.getPDDocument());                         writer.write(s);                         System.out.println(s);                         fis.close();                         writer.close();                                      }             }

下面是自己按照书上的例子写的代码。

 

  1package TestPDF.pdfbox;   2   3import java.io.File;   4import java.io.FileOutputStream;   5import java.io.IOException;   6import java.io.OutputStreamWriter;   7import java.io.Writer;   8import java.net.URL;   9  10import org.apache.lucene.analysis.standard.StandardAnalyzer;  11import org.apache.lucene.document.Document;  12import org.apache.lucene.index.IndexWriter;  13import org.apache.lucene.index.Term;  14import org.apache.lucene.search.IndexSearcher;  15import org.apache.lucene.search.PhraseQuery;  16import org.apache.lucene.search.Query;  17import org.apache.lucene.search.ScoreDoc;  18import org.apache.lucene.search.TermQuery;  19import org.apache.lucene.search.TopDocCollector;  20import org.apache.lucene.search.TopDocs;  21import org.pdfbox.pdmodel.PDDocument;  22import org.pdfbox.searchengine.lucene.LucenePDFDocument;  23import org.pdfbox.util.PDFTextStripper;  24  25public class Test {  26  27    public void getText(String file) throws Exception{  28        //是否排序  29        boolean sort = false;  30        //pdf文件名  31        String pdfFile = file;  32        //输入文本文件名称  33        String textFile = null;  34        //编码方式  35        String encoding = "UTF-8";  36        //开始提取页数  37        int startPage = 1;  38        //结束提取页数  39        int endPage = Integer.MAX_VALUE;  40        //文件输入流,输入文本文件  41        Writer output = null;   42        //内存中存储的PDF Document  43        PDDocument document = null;  44          45        try{  46            try{  47                //首先当作一个URL来加载文件,如果得到异常再从本地系统装载文件  48                URL url = new URL(pdfFile);  49                document = PDDocument.load(url);  50                String fileName = url.getFile();  51              52                if(fileName.length() > 4){  53                    //以原来pdf名称来命名新产生的txt文件  54                    File outputFile = new File(fileName.substring(0, fileName.length()-4) + ".txt");  55                    textFile = outputFile.getName();  56                }              57            }catch(Exception e){  58                //如果作为URL装载得到异常则从文件系统装载  59                document = PDDocument.load(pdfFile);  60                if(pdfFile.length() > 4){  61                    textFile = pdfFile.substring(0, pdfFile.length() - 4) + ".txt";  62                }  63            }  64            //文件输出流,写入文件到textFile  65            output = new OutputStreamWriter(new FileOutputStream(textFile),encoding);  66            //PDFTextStripper来提取文本  67            PDFTextStripper stripper = new PDFTextStripper();  68            //设置是否排序  69            stripper.setSortByPosition(sort);  70            //设置起始页  71            stripper.setStartPage(startPage);  72            //设置结束页  73            stripper.setEndPage(endPage);  74            //调用PDFTextStripper的writeText提取并输出文本  75            stripper.writeText(document, output);  76        }finally{  77            if(output != null){  78                output.close();                  79            }  80            if(document != null){  81                document.close();  82            }  83        }          84    }  85      86    /** *//**  87     * test Lucene with pdfbox  88     * @throws IOException  89     */  90    public void LuceneTest() throws IOException{  91          92        String path = "D:\\index";  93        String pdfpath = "D:\\index\\Lucene.Net基本用法.pdf";  94          95        IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(),true);  96        //writer.setMaxFieldLength(10240);  97        //LucenePDFDocument返回由PDF产生的Lucene Document  98        Document d = LucenePDFDocument.getDocument(new File(pdfpath));  99        //System.out.println(d); 100        //写入索引 101        writer.addDocument(d); 102        writer.close(); 103         104        //读取d:\index下的索引文件,建立IndexSearcher 105        IndexSearcher searcher = new IndexSearcher(path); 106        //对索引的contents Field进行关键字Query的查找 107        Term t = new Term("contents","优"); 108        Term m = new Term("contents","化"); 109        PhraseQuery q = new PhraseQuery(); 110        q.add(t); 111        q.add(m); 112        //Query q = new TermQuery(t); 113        TopDocCollector co = new TopDocCollector(10); 114        searcher.search(q,co); 115         116        Document document; 117        TopDocs docs = co.topDocs(); 118        ScoreDoc[] doc = docs.scoreDocs; 119        //System.out.println(doc.length); 120         121        for(int i=0;i<doc.length;i++){ 122            System.out.println("文档编号:" + doc[i].doc); 123            //document = searcher.doc(doc[i].doc); 124        } 125    } 126    /** *//** 127     * @param args 128     */ 129    public static void main(String[] args) { 130        // TODO Auto-generated method stub 131        Test test = new Test(); 132        try{ 133            //test.getText("D:\\index\\Lucene.Net基本用法.pdf"); 134            test.LuceneTest(); 135        }catch(Exception e){ 136            e.printStackTrace(); 137        } 138    } 139} 140

apache pdfbox的更多相关文章

  1. APache PDFbox API使用(1)----简单介绍

    因为项目的须要.近期在学习APache  PDFbox API,Apache PDFbox API是Apache Java 开源社区中个一个项目,其受Apache 版权 V2的保护,其提供了以下的功能 ...

  2. Apache PDFbox开发指南之PDF文档读取

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51542309 相关文章: <Apache PDFbox开发指南之PDF文本内容 ...

  3. 1.6.3 Uploading Data with Solr Cell using Apache Tika

    1. Uploading Data with Solr Cell using Apache Tika solr使用Apache Tika工程的代码提供了一个框架,用于合并所有不同格式的文件解析器为so ...

  4. 使用pdfbox分页保存pdf为图片

    一.背景 pdfbox作为Apache开源的PDF操作工具,允许创建新的PDF文档,操作现有文档,以及从文档中提取内容的能力.Apache PDFBox还包括一些命令行实用工具.本文楼主主要介绍其中的 ...

  5. PDFBox 打印带背景的文件速度慢

    打印慢的原因 java的RasterPrinterJob会执行很多次printPage方法 他应该是按块填充的, 如果页面元素非常复杂, 那么printPage方法可能会执行十几次. 而如果你用了如下 ...

  6. Java 使用PDFBox提取PDF文件中的图片

    今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...

  7. Working with PDF files in C# using PdfBox and IKVM

    I have found two primary libraries for programmatically manipulating PDF files;  PdfBox and iText. T ...

  8. Apache 项目列表功能分类便于技术选型

    big-data (49):  Apache Accumulo  Apache Airavata  Apache Ambari  Apache Apex  Apache Avro  Apache Be ...

  9. java 用PDFBox 删除 PDF文件中的某一页

    依赖: <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-app ...

随机推荐

  1. 最简单的基于FFMPEG的封装格式转换器(无编解码)

    本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...

  2. Qt编写串口通信程序全程图文解说

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...

  3. \n 与 \r

    符号 ASCII码 意义 \n 换行NL \r 回车CR 回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return 换行 \n 本义是光标往 ...

  4. pcap的pcap_dump()保存的文件格式

    (2009-09-01 20:36:49) 转载▼ 标签: 杂谈 分类: 专业 首先是tcpdump文件格式 当你在Windows或者Linux环境下用tcpdump命令抓取数据包时,你将得到如下格式 ...

  5. java定义类 对象,引用,指针

    java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构 ...

  6. artTemplate模板引擎的源码拜读

    最初接触的模板引擎还是基于node的ejs,当时觉得很神奇原来还可以这么玩,后来随着学习的深入,使用过jade,doT等,当然还有一些比较火的诸如juicer.underscore还没有深入接触,直到 ...

  7. css3 盒模型

    0,前言 在css2.1 之前,我们都熟知的两种盒模型,一种是w3c标准盒模型,另外一种是怪异模式下的盒模型.在css3之前我们一直使用的是标准盒模型,但是标准盒模型的宽度总是需要小心的去使用,稍有不 ...

  8. innosetup 安装静默安装msi,指定安装路径的方法

    自己看了很久帮助,分号的用法确实不太好用,湿了这个东东估计很多人会用到,发出来给大家参考. Filename: "{app}/msiexec.exe";Parameters: &q ...

  9. angularjs中异常处理

    1.TypeError: Cannot read property '$valid' of undefined a. Add ng-submit attribute to the form: < ...

  10. Oracle 11g-R2 SQL Developer连接MSSQL2008

    操作系统环境:WINDOWS8.1 工具: Oracle 11g-R2  SQL Developer 网络资源:http://sourceforge.net/project/showfiles.php ...