• apache pdfbox


    转 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=0;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
  • 相关阅读:
    C++中static_cast, dynamic_cast使用方法
    JavaScript中的Boolean 方法与Number方法
    參数预计:最大似然预计、贝叶斯预计与最大后验预计
    漫谈程序控制流
    怎样使用 RMAN 增量备份恢复 data guard log gap(日志断档)
    Unity3d修炼之路:GUIbutton简单使用,完毕对一个简单对象Cube的移动,旋转
    Python写自己主动化之邮件发送(匿名)
    LintCode
    缓存之 ACache
    Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes
  • 原文地址:https://www.cnblogs.com/DreamSea-for-Jimmy/p/3208529.html
Copyright © 2020-2023  润新知