5

このPDFの表からデータを取得しようとしています。少し運が良かったのでpdfminerとpypdfを試しましたが、実際にはテーブルからデータを取得できません。

テーブルの 1 つが次のようになります。 ここに画像の説明を入力

ご覧のとおり、一部の列は「x」でマークされています。このテーブルをオブジェクトのリストにしようとしています。

これはこれまでのコードです。現在pdfminerを使用しています。

# pdfminer test
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice, TagExtractor
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, PDFPageAggregator
from pdfminer.cmapdb import CMapDB
from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTFigure, LTImage
from pdfminer.image import ImageWriter
from cStringIO import StringIO
import sys
import os


def pdfToText(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ''
    maxpages = 0
    caching = True
    pagenos = set()

    records = []
    i = 1
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,
                                  caching=caching, check_extractable=True):
        # process page
        interpreter.process_page(page)

        # only select lines from the line containing 'Tool' to the line containing "1 The 'All'"
        lines = retstr.getvalue().splitlines()

        idx = containsSubString(lines, 'Tool')
        lines = lines[idx+1:]
        idx = containsSubString(lines, "1 The 'All'")
        lines = lines[:idx]

        for line in lines:
            records.append(line)
        i += 1

    fp.close()
    device.close()
    retstr.close()

    return records


def containsSubString(list, substring):
    # find a substring in a list item
    for i, s in enumerate(list):
        if substring in s:
            return i
    return -1


# process pdf
fn = '../test1.pdf'
ft = 'test.txt'

text = pdfToText(fn)
outFile = open(ft, 'w')
for i in range(0, len(text)):
    outFile.write(text[i])
outFile.close()

これによりテキスト ファイルが生成され、すべてのテキストが取得されますが、x の間隔は保持されません。出力は次のようになります。 ここに画像の説明を入力

x は、テキスト ドキュメント内のシングル スペースです。

現在、私はテキスト出力を生成しているだけですが、私の目標は、テーブルからのデータを使用して html ドキュメントを生成することです。私は OCR の例を探してきましたが、それらのほとんどはわかりにくいか不完全なようです。私は、探している結果を生成する可能性のある C# またはその他の言語を使用することにオープンです。

編集:テーブルデータを取得する必要がある、このような複数のpdfがあります。ヘッダーはすべてのpdfで同じになります(私が知る限り)。

4

2 に答える 2

3

私はそれを理解しました、私は間違った方向に進んでいました。私がしたことは、pdf の各テーブルの png を作成することでした。現在、opencv と python を使用して画像を処理しています。

于 2015-01-15T16:54:21.793 に答える
2

Tabulaを試してみて、動作する場合はtabula-extractor ライブラリ(ruby で記述) を使用してプログラムでデータを抽出します。

于 2015-01-13T18:07:05.770 に答える