我有一堆PDF - 可能有数百或数千.它们的格式不一样,但是它们中的任何一个都可能有一个或多个表,其中包含我想要收集到单独数据库中的有趣信息.
当然,我知道我必须写一些东西来做这件事.Perl是我的选择 - 或者也许是Java.我不关心什么语言,只要它是免费的(或者在免费试用期间便宜以确保它适合我的目的).
我正在看CAM :: Parse(使用草莓Perl),但我不确定如何使用它来定位和提取文件中的表.我想我确实偏爱Perl,但实际上我想要一些可靠的工作,并且相当容易进行字符串操作.
这样的事情有什么好办法?我是第一个,所以如果java(或python等)有更好的钩子,现在是了解它的好时机.一般指针好; 首选代码将是首选代码.
我正在尝试使用PDFMiner python绑定从大量PDF中提取文本.我写的模块适用于许多PDF,但是对于一部分PDF,我得到了一些有些神秘的错误:
ipython堆栈跟踪:
/usr/lib/python2.7/dist-packages/pdfminer/pdfparser.pyc in set_parser(self, parser)
331 break
332 else:
--> 333 raise PDFSyntaxError('No /Root object! - Is this really a PDF?')
334 if self.catalog.get('Type') is not LITERAL_CATALOG:
335 if STRICT:
PDFSyntaxError: No /Root object! - Is this really a PDF?
Run Code Online (Sandbox Code Playgroud)
当然,我立即检查这些PDF是否已损坏,但它们可以被正确读取.
尽管没有根对象,有没有办法阅读这些PDF?我不太确定从哪里开始.
非常感谢!
编辑:
我尝试使用PyPDF试图获得一些差异诊断.堆栈跟踪如下:
In [50]: pdf = pyPdf.PdfFileReader(file(fail, "rb"))
---------------------------------------------------------------------------
PdfReadError Traceback (most recent call last)
/home/louist/Desktop/pdfs/indir/<ipython-input-50-b7171105c81f> in <module>()
----> 1 pdf = pyPdf.PdfFileReader(file(fail, "rb"))
/usr/lib/pymodules/python2.7/pyPdf/pdf.pyc in __init__(self, stream)
372 self.flattenedPages = None
373 self.resolvedObjects = …
Run Code Online (Sandbox Code Playgroud) 所以我试图从pdf文件中提取文本,我需要它的位置,宽度,高度,字体.
我尝试了很多,但最有用和最完整的解决方案看起来是PDFMiner,在这种情况下,更确切地说是pdf2txt.py.
我已经按照文档和示例进行操作,并尝试Learn More
使用以下命令从我的pdf中提取文本:
pdf2txt.py -Y normal -t xml -o buttons.xml buttons.pdf
Run Code Online (Sandbox Code Playgroud)
输出buttons.xml
看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<pages>
<page id="1" bbox="0.000,0.000,799.900,449.944" rotate="0">
<textbox id="0" bbox="164.979,213.240,247.680,235.944">
<textline bbox="164.979,213.240,247.680,235.944">
<text font="KZNUUP+HelveticaNeue-Bold" bbox="164.979,213.240,178.978,235.944" size="22.704">(cid:51)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="173.280,213.240,187.278,235.944" size="22.704">(cid:76)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="181.315,213.240,195.313,235.944" size="22.704">(cid:72)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="189.350,213.240,203.348,235.944" size="22.704">(cid:89)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="194.795,213.240,208.793,235.944" size="22.704">(cid:85)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="203.096,213.240,217.094,235.944" size="22.704">(cid:3)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="206.987,213.240,220.986,235.944" size="22.704">(cid:52)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="219.684,213.240,233.682,235.944" size="22.704">(cid:86)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="228.237,213.240,242.235,235.944" size="22.704">(cid:89)</text>
<text font="KZNUUP+HelveticaNeue-Bold" bbox="233.682,213.240,247.680,235.944" size="22.704">(cid:76)</text>
<text></text>
</textline>
</textbox>
<textgroup bbox="164.979,213.240,419.659,235.944"> …
Run Code Online (Sandbox Code Playgroud) 我正在使用PDF.js框架来呈现PDF.我正在使用base64数据来呈现PDF.但在IE 11 pdf看起来模糊.
从IE 11中查看以下屏幕
见下面的代码:
var renderPDF = function(url, canvasContainer,data) {
var scale= 0.9; //"zoom" factor for the PDF
function renderPage(page) {
var canvas = document.createElement('canvas');
var viewport = page.getViewport(scale);
var ctx = canvas.getContext('2d');
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
canvas.height = viewport.height;
canvas.width = viewport.width;
canvasContainer.appendChild(canvas);
page.render(renderContext);
}
function renderPages(pdfDoc) {
for(var num = 1; num <= pdfDoc.numPages; num++)
pdfDoc.getPage(num).then(renderPage);
}
PDFJS.disableWorker = false;
var pdfAsDataUri = "data:application/pdf;base64,"+data; // shortened
var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
PDFJS.getDocument(pdfAsArray).then(renderPages); …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用camelot-py v0.7.3 从多页PDF 文件中提取表格。
到目前为止,它对我来说是最好的 pdf 阅读器工具。我只需要逐行阅读 pdf 并手动检测表格。我尝试了许多其他工具,例如 tabula、PyPDF2/4、pdfminer 等。其中一些无法正确检测文本本身,其中一些扰乱了单词序列或列之间的间距。
但camelot-py 为我提供了最适合我的应用程序的格式的数据。
在使用camelot-py从pdf中提取数据的过程中,它几乎很好地检测了所有表的数据,除了很少的错误:
它将多个表分组到同一个“TableList”元素中。但我可以将这些分组的表分开。所以这里不需要担心。
这些分组表中的最后一个表在单独的“TableList”元素中重复。这种重复是我最关心的问题。
上述过程使用的代码如下:
tables = camelot.read_pdf('test.pdf', pages='1-end', flavor='stream')
tables.export('foo.csv', f='csv', compress=False)
for table in tables:
table_df = table.df
# Code to parse data from tables in each element converted into datafram
Run Code Online (Sandbox Code Playgroud)
为什么camelot-py 会重复一些表?有什么办法可以处理这种重复吗?
更多信息:
输入 PDF 文件:由于敏感数据,我无法共享 pdf 文件。但这里有一些细节可以让您很好地了解其结构: 所有页面仅包含表格。第 1 页:包含表 1,其中包含客户信息。表2至表4结构相同
第 2 页:包含表 4 和表 5 至 7 中的一些行,其结构与表 2 相同
第3页:表8至10,结构与表2相同
输出 CSV 文件:
foo-page-1-table-1:包含表 1
foo-page-1-table-2:包含表 1 和表 2 至 4 …
我需要解析PDF文档.我已经实现了解析器并使用了库iText,直到现在它都没有任何问题.
但是,我不需要解析另一个在单词中间会得到非常奇怪的空格的文档.作为例子,我得到:
Vo rber eitung auf die Motorr adsaison.Viele Motorr ADF AHR呃
所有大胆的单词都应该连接起来,但不知何故,PDF Parser会在单词中添加空格.但是当我将PDF中的内容复制并粘贴到文本文件中时,我得不到这些空格.
首先我认为这是因为我正在使用的PDF解析库,而且还有另一个库我得到了完全相同的问题.
我singleSpaceWidth
从解析过的单词中查看了一下,我发现当它添加一个空格时,它总是变化的.我试图将它们手动放在一起.但由于没有真正重新组合单词的模式,这几乎是不可能的.
是否有其他人有类似的问题,甚至解决了这个问题?
根据要求,这里有一些更多的信息:
使用SemTextExtractionStrategy进行解析:
PdfReader reader = new PdfReader("data/SpecialTests/SuedostSchweiz/" + src);
SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy();
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
// Set the page number on the strategy. Is used in the Parsing strategies.
semTextExtractionStrategy.pageNumber = i;
// Parse text from page
PdfTextExtractor.getTextFromPage(reader, i, semTextExtractionStrategy);
}
Run Code Online (Sandbox Code Playgroud)
这里实际解析文本的SemTextExtractionStrategy方法.我在每个解析的单词之后手动添加一个空格,但不知何故它会在检测中拆分单词:
@Override
public void parseText(TextRenderInfo …
Run Code Online (Sandbox Code Playgroud) 我无法在pdf文件中检测到空白页面.我已经搜索了互联网,但找不到一个好的解决方案.
使用Itextsharp我尝试了页面大小,Xobjects.但他们没有给出确切的结果.
我试过了
if(xobjects==null || textcontent==null || size <20 bytes )
then "blank"
else
not blank
Run Code Online (Sandbox Code Playgroud)
但是它返回错误答案的最长时间.我用过Itextsharp
代码如下......我正在使用Itextsharp Librabry
对于xobjects
PdfDictionary xobjects = resourceDic.GetAsDict(PdfName.XOBJECT);
//here resourceDic is PdfDictionary type
//I know that if Xobjects is null then page is blank. But sometimes blank page gives xobjects which is not null.
Run Code Online (Sandbox Code Playgroud)
对于contentstream
RandomAccessFileOrArray f = reader.SafeFile;
//here reader = new PdfReader(filename);
byte[] contentBytes = reader.GetPageContent(pageNum, f);
//I have measured the size of contentbytes but sometimes it gives more than …
Run Code Online (Sandbox Code Playgroud) 使用pdfminer(pdf2txt.py)处理PDF 文件(2.pdf)时收到以下错误:
pdf2txt.py 2.pdf
Traceback (most recent call last):
File "/usr/local/bin/pdf2txt.py", line 115, in <module>
if __name__ == '__main__': sys.exit(main(sys.argv))
File "/usr/local/bin/pdf2txt.py", line 109, in main
interpreter.process_page(page)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 832, in process_page
self.render_contents(page.resources, page.contents, ctm=ctm)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 843, in render_contents
self.init_resources(resources)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 347, in init_resources
self.fontmap[fontid] = self.rsrcmgr.get_font(objid, spec)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 195, in get_font
font = self.get_font(None, subspec)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 186, in get_font
font = PDFCIDFont(self, spec)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdffont.py", line 654, in __init__ …
Run Code Online (Sandbox Code Playgroud) pdf-parsing ×10
pdf ×6
python ×5
parsing ×2
ruby ×2
.net ×1
c# ×1
canvas ×1
extract ×1
itext ×1
itextsharp ×1
java ×1
javascript ×1
pdf-reader ×1
pdf.js ×1
pdfminer ×1
pdftotext ×1
pypdf ×1
whitespace ×1
xml ×1