`

java pdf

    博客分类:
  • java
阅读更多
引用 :http://www.iteye.com/post/599330
各位好:在javaeye好长时间了,一直在各大网站学习各位的经验很感谢各位,目前我遇到一个关于lucene索引的问题,在国内和国外的网站上找了很久也没找到一个比较满意的解决办法,所以在这里想问问大家,希望有过这方面的经验的朋友给些帮助,最好能有些比较好的代码或可行性建议,我的代码大概如下



import com.messagesolution.message.viewer.util.HtmlDocument;
import com.messagesolution.util.logger.Logger;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.util.PDFTextStripper;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.textmining.text.extraction.WordExtractor;

import java.io.*;


public class DocumentConverter
{

 public static boolean convertPDF(String fromfile, String tofile)
    {
        PDFParser parser = null;
        String s = null;
        FileInputStream in = null;
        FileOutputStream fos = null;
        //BufferedOutputStream bos = null;
        DataOutputStream dos = null;
        try
        {
            try {
    PDFTextStripper _stripper = new PDFTextStripper();
    in = new FileInputStream(new File(fromfile));
    parser = new PDFParser(in);
    parser.parse();
    s = _stripper.getText(parser.getDocument());
    if (StringToolKit.isEmpty(s)){
     Logger.getInstance().error("read string of pdf is empty");
     
     return false;       //nothing to write
    }
        
   } catch (Exception e) {
    Logger.getInstance().error("read pdf or convert it error");
    e.printStackTrace();
    return false;
   }

            try {
    //now write this string to a file
    fos = new FileOutputStream(new File(tofile));
    //bos = new BufferedOutputStream(fos);
    //bos.write(s.getBytes());  //what about other language?
    dos = new DataOutputStream(fos);
    dos.writeBytes(s);
   } catch (Exception e) {
    Logger.getInstance().error("write converted txt error");
    e.printStackTrace();
    return false;
   }
        }
        catch (Throwable t)
        {
            if (t instanceof OutOfMemoryError)
                Logger.getInstance().fatal("OutOfMemoryError occurred in convertPDF for file: " + fromfile, t);
            System.err.println("Exception occurred in convertPDF, t: " + t);
            t.printStackTrace();
            return false;   //something wrong during the conversion
        }
        finally {
            try
            {
                if (parser != null)
                    parser.getDocument().close();
                if (in != null)
                    in.close();
                if (fos != null)
                    fos.close();
                //if (bos != null)
                //    bos.close();
                if (dos != null)
                    dos.close();
            } catch (Exception ex) {
              Logger.getInstance().error(ex.toString());
            }
        }

  return true;
 }

 public static boolean convertDOC(String fromfile, String tofile)
    {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        DataOutputStream dos = null;

        try
        {
            fis = new FileInputStream (new File(fromfile));
            WordExtractor extractor = new WordExtractor();
            String s = extractor.extractText(fis);

            //now write this string to a file
            fos = new FileOutputStream(new File(tofile));
            //bos = new BufferedOutputStream(fos);
            //bos.write(s.getBytes());  //what about other language?
            dos = new DataOutputStream(fos);
            dos.writeBytes(s);
        }
        catch (Throwable t)
        {
            if (t instanceof OutOfMemoryError)
                Logger.getInstance().fatal("OutOfMemoryError occurred in convertDOC for file: " + fromfile, t);
            System.err.println("Exception occurred in convertDOC, t: " + t);
            t.printStackTrace();
            return false;   //something wrong during the conversion
        }
        finally
        {
            try
            {
                if (fis != null)
                    fis.close();
                if (fos != null)
                    fos.close();
                if (dos != null)
                    dos.close();
            } catch (Exception e) {}
        }

  return true;
 }

 public static boolean convertHTML(String fromfile, String tofile)
    {
        try
        {
            String htmlCharset = HtmlDocument.convertHtml(fromfile, tofile);
            System.out.println("htmlCharset: " + htmlCharset);
        }
        catch (Throwable t)
        {
            if (t instanceof OutOfMemoryError)
                Logger.getInstance().fatal("OutOfMemoryError occurred in convertHTML for file: " + fromfile, t);
            System.err.println("Exception occurred in convertHTML, t: " + t);
            t.printStackTrace();
            return false;   //something wrong during the conversion
        }

  return true;
 }

 public static boolean convertPPT(String fromfile, String tofile)
    {
        System.err.println("convertPPT not supported yet!");
        Thread.dumpStack();
        return false;
 // return false;
 }

 public static boolean convertXLS(String fromfile, String tofile)
    {
        StringBuffer sb = new StringBuffer();
        FileInputStream fis = null;
        FileOutputStream fos = null;
        DataOutputStream dos = null;
        HSSFWorkbook wb = null;

        try
        {
            fis = new FileInputStream(new File(fromfile));
            wb = new HSSFWorkbook(fis);

            int numSheets = wb.getNumberOfSheets();
            for (int i=0;i<numSheets;++i)
            {
                HSSFSheet sheet = wb.getSheetAt(i);
                int numRows = sheet.getLastRowNum();
                for (int j=0;j<numRows;++j)
                {
                    HSSFRow row = sheet.getRow(j);
                    if (row == null)
                        continue;
                    
                    int numCells = row.getLastCellNum();
                    for (int k=0;k<numCells;++k)
                    {
                        HSSFCell cell = row.getCell((short)k);
                        if(cell!=null)
                        {
                            int type = cell.getCellType();
                            if(type==HSSFCell.CELL_TYPE_STRING)
                            {
                                String str = cell.getStringCellValue();
                                str=str.trim();
                                str=replace(str,"\n","");
                                sb.append(str).append(" ");
                            }
                        }
                        // We will ignore all other types - numbers, forumlas, etc.
                        // as these don't hold alot of meaning outside of their tabular context.
                        // else if(type==, CELL_TYPE_NUMERIC, CELL_TYPE_FORMULA, CELL_TYPE_BOOLEAN, CELL_TYPE_ERROR
                    } // cells
                    //sb.append("\n"); // break on each row
                } // rows
                sb.append("\n"); // break on each sheet
            } // sheets

            String s = sb.toString();
            //now write this string to a file
            fos = new FileOutputStream(new File(tofile));
            //bos = new BufferedOutputStream(fos);
            //bos.write(s.getBytes());  //what about other language?
            dos = new DataOutputStream(fos);
            dos.writeBytes(s);
        }
        catch (Throwable t)
        {
            if (t instanceof OutOfMemoryError)
                Logger.getInstance().fatal("OutOfMemoryError occurred in convertXSL for file: " + fromfile, t);
            System.err.println("Exception occurred in convertXSL, t: " + t);
            t.printStackTrace();
            return false;   //something wrong during the conversion
        }
        finally
        {
            try
            {
                if (fis != null)
                    fis.close();
                if (fos != null)
                    fos.close();
                if (dos != null)
                    dos.close();
            } catch (Exception e) {}
        }

  return true;
 }


    // This should really be made 'static' and moved into a utility class,
 // included here to simplify things
    private final static String replace(String line, String oldString, String newString)
    {
        if (line == null) {
            return null;
        }
        int i = 0;
        if ((i = line.indexOf(oldString, i)) >= 0) {
            char[] line2 = line.toCharArray(); char[] newString2 = newString.toCharArray(); int oLength = oldString.length();
            StringBuffer buf = new StringBuffer(line2.length); buf.append(line2, 0, i).append(newString2); i += oLength;
            int j = i;
            while ((i = line.indexOf(oldString, i)) > 0) {
                buf.append(line2, j, i - j).append(newString2); i += oLength; j = i;
            }
            buf.append(line2, j, line2.length - j); return buf.toString();
        }
        return line;
    }

    public static void main(String[] args)
    {
        int index = 0;
        String action = args[index++];
        String f1 = args[index++];
        String f2 = args[index++];

        long start = System.currentTimeMillis();
        long end = 0;
        if (action.equals("pdf"))
            convertPDF(f1, f2);
        else if (action.equals("doc"))
            convertDOC(f1, f2);
        else if (action.equals("xls"))
            convertXLS(f1, f2);
        else if (action.equals("ppt"))
            convertPPT(f1, f2);
        else if (action.equals("ppt"))
            convertHTML(f1, f2);

        end = System.currentTimeMillis();
        System.out.println(action + " convert " + f1 + " took " + ((end-start)/1000) + " seconds.");
    }

}





main方法主要是输入三个参数 第一个是转换文档的格式,第二个是文档存放的路径,第三个是要输出的文档存放的位置,

然后对输出的文档进行索引, 平均每个文档在1M-5M之间,

问题: 在进行文档转换的时候pdf,word,xls 都非常慢,本来想写一个threadpool来进行文档的转换,可是测试数据表明多线程转换还不如单线程的快,而且也容易出现outofmemory, 后来我又想了一个办法,把大的pdf ,word xls 进行切分,可是写了一个java的切分成小文档的方法,只能对txt文档进行转换,word 和pdf 因为里面有很多格式和样式的东西都是二进制的,在合成一个大的文档就合并不回去了(c++ 或.net 到时有办法切分),所以希望有过索引大量pdf ,word,xls 文档的朋友给写帮助,能快速处理, 目前的数据量大概是1T(大概是100G),服务器配置大概是4个cpu ,4G内存,虚拟机开到了1.2个G用的是jdk1.4在大也开不了了,谢谢帮助


分享到:
评论

相关推荐

    java pdf合并实例

    在Java开发中,PDF文档处理是一项常见的任务,特别是在企业级应用中,可能需要将多个PDF文件合并成一个,便于管理和阅读。本实例将探讨如何使用Java进行PDF合并,特别是通过iText库实现这一功能。 iText是一个开源...

    java pdf 实现电子签章下载

    Java PDF实现电子签章是PDF文档处理中的一个重要技术,它涉及到PDF库的使用以及数字证书的应用。在这个场景中,我们关注的是使用iTextPDF和PDFBox两个流行的Java库来完成电子签章的功能。这两个库提供了丰富的API,...

    Java PDF转图片 完美方案 绝对可用

    基于apache pdfbox库实现Java PDF转图片,带源码和pom文件; 开发环境导入maven工程,PdfToImg为测试类,修改其中test.pdf和test.png的路径即可运行; PDFUtil为独立工具类,可放置任何工程中运行。 如果在linux...

    java PDF关键字定位

    在Java开发中,处理PDF文档是一项常见的任务,特别是在需要搜索、提取或替换PDF中的特定信息时。本篇文章将深入探讨如何使用iText库在Java中实现PDF关键字定位。iText是一个强大的PDF处理库,它提供了丰富的API来...

    JavaPDF操作类库API_Free Spire.PDF for Java_5.1.0

    1.功能:该API为适用于Java平台下,通过后端程序代码调用API接口操作PDF文档,可实现如下功能: 1.1 文档转换:PDF转图片/Word/SVG/XPS/HTML/XPS/TIFF、图片转PDF 1.2 文档操作:文档创建、合并、拆分、压缩、复制...

    java PDF文件处理库 aspose-pdf-17.8.jar ,好用

    Java PDF文件处理是一个重要的领域,尤其在开发企业级应用时,常常需要对PDF文档进行创建、编辑、转换或渲染等操作。Aspose.PDF是一款强大的Java库,它为开发者提供了全面的API,使得处理PDF文档变得简单高效。在这...

    java_pdf.rar_JAVA.pdf _java pdf_java操作pdf

    Java PDF技术是Java开发者在处理PDF文档时常用的一种工具,主要用来创建、编辑或读取PDF文档。在Java中操作PDF,通常会借助第三方库,如iText库,这是一个功能强大的PDF处理库,广泛应用于各种PDF相关的开发任务。 ...

    免费版 PDF Java组件_Free Spire.PDF for Java 1.1.0

    Free Spire.PDF for JAVA 是一个 100% 免费的 PDF API, 在 JAVA 应用程序上调用该组件即可读取,写入和保存 PDF 文档,无需安装 Adobe Acrobat。使用此 JAVA PDF 组件,开发人员可以在 JAVA 应用程序(J2SE 和 J2EE...

    Java web 打印,Java pdf打印,Java 打印

    在Java开发中,Web打印和PDF打印是两个重要的技术领域,尤其在企业级应用中,它们经常被用来生成报告、发票、合同等文档。本文将深入探讨这些技术,并结合项目描述,提供一个详尽的解释。 首先,让我们从Java Web...

    pdf_java.rar_PDF417 Java Barcode_java pdf_java pdf417_pdf java_p

    献给对条码感兴趣的朋友,生成PDF417的JAVA包,含有反编译源码

    java pdf基础资料

    java pdf基础资料java pdf基础资料java pdf基础资料

    java实现pdf上传、下载、在线预览、删除、修改等功能

    在Java编程环境中,处理PDF(Portable Document Format)文件是一项常见的任务,这通常涉及到文件的上传、下载、在线预览、删除以及修改等操作。以下是对这些功能的详细说明: 1. **PDF上传**: PDF文件的上传主要...

    21天学会java pdf格式的书

    21天学会java pdf格式的书 相当不错的书

    java编写的PdfViewer

    Java PDF Viewer是一款基于Java开发的PDF阅读器,它允许用户在Java环境中查看和操作PDF文档。这个工具提供了多种功能,包括浏览PDF文件、翻页、缩放以及自适应布局,以适应不同屏幕尺寸和宽度的需求。以下是关于Java...

    java 多个pdf合并,目录生成(支持自定义目录),页码生成(源码)

    在Java开发中,有时我们需要处理多个PDF文档,例如将它们合并成一个文件或者为合并后的文件生成目录和页码。这个任务通常出现在报告生成、文档整合等场景中。本项目提供了一个纯Java实现的解决方案,它能有效地完成...

    java多种方式实现pdf文件电子签名

    在这个项目中,我们主要探讨了利用iTextPDF和PDFBox两个库在Java环境下如何进行PDF电子签名的实现。 iTextPDF是一个流行的Java库,专门用于创建、修改和处理PDF文档。它的电子签名功能强大,支持创建、验证和添加...

    java pdf电子书及习题

    java pdf电子书及习题java pd

    Java PDF 转换WORD Spire jar 包

    Java PDF转换为Word是开发过程中常见的一种需求,特别是在文档处理和数据迁移的场景下。Spire.jar包提供了一个高效且方便的解决方案,它是一个由E Dokument Solutions开发的Java库,专门用于处理PDF文档,包括转换为...

    java解析PDF文件

    java解析PDF格式的文件demo。JAVA实现PDF解析,对PDF文件中的文本内容可输出仅供参考学习,不喜勿喷。

Global site tag (gtag.js) - Google Analytics