使用java一次读取一页pdf uploadstream
我正在尝试在 j2ee 应用程序中阅读 pdf 文档。
对于网络应用程序,我必须将 pdf 文档存储在磁盘上。 为了使搜索变得容易,我想对文档内的文本进行反向索引; 如果是OCR的话。
使用 PDFbox 库,可以创建包含整个 pdf 文件的 pdfDocument 对象。 然而,为了保留内存并提高整体性能,我宁愿将文档作为流处理,并一次将一页读入缓冲区。
我想知道是否可以一页一页甚至一次一行地读取包含 pdf 的文件流。
I am trying to read a pdf document in a j2ee application.
For a webapplication I have to store pdf documents on disk. To make searching easy I want to make a reverse index of the text inside the document; if it is OCR.
With the PDFbox library its possible to create a pdfDocument object wich contains an entire pdf file. However to preserve memory and improve overall performance I'd rather handle the document as a stream and read one page at a time into a buffer.
I wonder if it is possible to read a filestream containing pdf page by page or even one line at a time.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对于给定的通用 pdf 文档,至少使用 PDFBox,您无法知道一页结束位置和另一页开始位置。
如果您关心的是资源的使用,我建议您将pdf文档解析为COSDocument,使用.getObjects()从COSDocument中提取解析后的对象,这将为您提供一个java.util.List。 这应该很容易融入您拥有的任何稀缺资源。
请注意,您可以通过 PDFBox API 轻松地将解析后的 pdf 文档转换为 Lucene 索引。
另外,在进入优化领域之前,请确保您确实需要它们。 PDFBox 能够毫不费力地在内存中表示相当大的 PDF 文档。
要从 InputStream 解析 PDF 文档,请查看 COSDocument 类
要编写 lucene 索引,请查看 LucenePDFDocument 类
对于 COSDocuments 的内存中表示,请查看 FDF文档
For a given generic pdf document you have no way of knowing where one page end and another one starts, using PDFBox at least.
If your concern is the use of resources, I suggest you parse the pdf document into a COSDocument, extract the parsed objects from the COSDocument using the .getObjects(), which will give you a java.util.List. This should be easy to fit into whatever scarce resources you have.
Note that you can easily convert your parsed pdf documents into Lucene indexes through the PDFBox API.
Also, before venturing into the land of optimisations, be sure that you really need them. PDFBox is able to make an in-memory representation of quite large PDF documents without much effort.
For parsing the PDF document from an InputStream, look at the COSDocument class
For writing lucene indexes, look at LucenePDFDocument class
For in-memory representations of COSDocuments, look at FDFDocument
在 2.0.* 版本中,像这样打开 PDF:
这会将缓冲内存使用设置为仅使用没有大小限制的临时文件(无主内存)。
此处回答了这个问题。
In the 2.0.* versions, open the PDF like this:
This will setup buffering memory usage to only use temporary file(s) (no main-memory) with no restricted size.
This was answered here.
查看 PDF 渲染器 Java 库。 我自己试过了,看起来比PDFBox快很多。 不过,我还没有尝试过获取 OCR 文本。
以下是从上面的链接复制的示例,展示了如何将 PDF 页面绘制到图像中:
Take a look at the PDF Renderer Java library. I have tried it myself and it seems much faster than PDFBox. I haven't tried getting the OCR text, however.
Here is an example copied from the link above which shows how to draw a PDF page into an image:
我想您可以逐字节读取文件以查找分页符。 由于可能存在 PDF 格式问题,逐行更加困难。
I'd imagine you can read through the file byte by byte looking for page breaks. Line by line is more difficult because of possible PDF formatting issues.