使用java每次读取一页pdf uploadstream

使用java每次读取一页pdf uploadstream,java,pdf,inputstream,pdfbox,Java,Pdf,Inputstream,Pdfbox,我正在尝试在j2ee应用程序中读取pdf文档 对于Web应用程序,我必须将pdf文档存储在磁盘上。为了便于搜索,我想对文档中的文本进行反向索引;如果是OCR 使用PDFbox库,可以创建包含整个pdf文件的pdfDocument对象。然而,为了保留内存并提高整体性能,我宁愿将文档作为流处理,并将一页一页地读入缓冲区 我想知道是否可以一页一页甚至一行地读取包含pdf的文件流 我想你可以一个字节一个字节地阅读文件,寻找分页符。由于可能存在PDF格式问题,逐行比较困难。对于给定的通用PDF文档,至少使

我正在尝试在j2ee应用程序中读取pdf文档

对于Web应用程序,我必须将pdf文档存储在磁盘上。为了便于搜索,我想对文档中的文本进行反向索引;如果是OCR

使用PDFbox库,可以创建包含整个pdf文件的pdfDocument对象。然而,为了保留内存并提高整体性能,我宁愿将文档作为流处理,并将一页一页地读入缓冲区


我想知道是否可以一页一页甚至一行地读取包含pdf的文件流

我想你可以一个字节一个字节地阅读文件,寻找分页符。由于可能存在PDF格式问题,逐行比较困难。

对于给定的通用PDF文档,至少使用PDFBox,您无法知道一页的结束位置和另一页的开始位置

如果您关心的是资源的使用,我建议您将pdf文档解析为COSDocument,使用.getObjects()从COSDocument中提取解析的对象,这将为您提供一个java.util.List。这应该很容易适应你拥有的任何稀缺资源

请注意,您可以通过PDFBOXAPI轻松地将解析后的pdf文档转换为Lucene索引

此外,在进入优化领域之前,请确保您确实需要它们。PDFBox能够在内存中表示相当大的PDF文档,而无需付出很多努力

要从InputStream解析PDF文档,请查看类

要编写lucene索引,请查看类

有关文档的内存表示,请查看Java库。我自己也试过,似乎比PDFBox快得多。但是,我还没有尝试获取OCR文本

下面是从上面的链接复制的示例,该示例演示了如何将PDF页面绘制到图像中:

    File file = new File("test.pdf");
    RandomAccessFile raf = new RandomAccessFile(file, "r");
    FileChannel channel = raf.getChannel();
    ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    PDFFile pdffile = new PDFFile(buf);

    // draw the first page to an image
    PDFPage page = pdffile.getPage(0);

    //get the width and height for the doc at the default zoom 
    Rectangle rect = new Rectangle(0,0,
            (int)page.getBBox().getWidth(),
            (int)page.getBBox().getHeight());

    //generate the image
    Image img = page.getImage(
            rect.width, rect.height, //width & height
            rect, // clip rect
            null, // null for the ImageObserver
            true, // fill background with white
            true  // block until drawing is done
            );

在2.0.*版本中,按如下方式打开PDF:

PDDocument doc = PDDocument.load(file, MemoryUsageSetting.setupTempFileOnly());
这将设置缓冲内存使用情况,使其仅使用临时文件(无主内存),且大小不受限制

此问题已得到回答。

可能重复