2017-11-22 1 views
0

Scrapyを使用して、pdfをダウンロードしてバイナリファイルをメモリに読み込んで内容を抽出します。私は、PDFがのように見えるページに埋め込まれていることを実現:埋め込みPDFを抽出する - PDFInterpreterError:不明な演算子: ' x00'

<embed id="plugin" type="application/x-google-chrome-pdf" src="http:xxx/DocumentInquiry.aspx?DocumentNo=12502" stream-url="blob:chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/1c86700d-0230-43b1-8b5e-eb219a2220af" headers="Content-Type: application/pdf 
Content-Length: 50080 
Cache-Control: private 
Server: Microsoft-IIS/7.5 
Content-Disposition: inline;filename=DocumentInquiry.pdf 
X-Powered-By: ASP.NET 

私はHTTPのscrapyのresponse.bodyを開くとき:?XXX/DocumentInquiry.aspx DocumentNo = 12502 Iで始まる文字列を参照してください。

'%PDF-1.4\n%\xe2\xe3\xcf\xd3\r\n1 0 obj\n<</Type /Page\n/Parent 2 0 R\n/MediaBox [ 0 0 612.000 792.000 ]\n/Resources <</XObject 3 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]>>/Contents [ 4 0 R ]\n/Rotate 0\n>>\r\nendobj\n5 0 obj\n<</Type /XObject /Subtype /Image\n/Name /JI1Obj1\n/Width 1275 /Height 1650\n/BitsPerComponent 8\n/ColorSpace /DeviceRGB\n/Filter [ /FlateDecode /DCTDecode ]\n/Length 6 0 R>>\r\nstream\r\nx\x9c\xed\x9dYl\x1bE\x18\x80g}\xa4I\n\x88\xa4[Sh\x11m\xe9\x 

ここではどのようにしてpdfを抽出しますか?

編集:私はラインで次のエラーを取得しています「PDFPage.get_page中のページの...」

def convert_pdf_to_html(string): 

    in_memory_pdf = BytesIO(
     bytes(string)) # in_memory_pdf IS A FILE LIKE OBJECT SO DOES NOT NEED TO BE OPENED, CLOSED ETC 

    rsrcmgr = PDFResourceManager() 
    retstr = BytesIO() 

    codec = 'utf-8' 
    laparams = LAParams() 

    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) # CONSIDER TextConverter FOR TEXT 
    # device = HTMLConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) # CONSIDER HTMLConverter FOR HTML 

    interpreter = PDFPageInterpreter(rsrcmgr, device) 
    password = "" 
    maxpages = 0 
    caching = True 
    pagenos = set() 
    for page in PDFPage.get_pages(in_memory_pdf, pagenos, maxpages=maxpages, password=password, caching=caching, 
            check_extractable=True): 
     interpreter.process_page(page) 
    device.close() 
    st = retstr.getvalue() 
    retstr.close() 
    return st 

私が以前働いている次の関数でpdfminerを使用しています
File "MypROJEctspiders\forc_spider.py", line 313, in get_order 
    full_text = convert_pdf_to_html(response.body) 
    File "MypROJEctspiders\forc_spider.py", line 51, in convert_pdf_to_html 
    interpreter.process_page(page) 
    File "E:\Miniconda2\envs\contact2E\lib\site-packages\pdfminer\pdfinterp.py", line 834, in process_page 
    self.render_contents(page.resources, page.contents, ctm=ctm) 
    File "E:\Miniconda2\envs\contact2E\lib\site-packages\pdfminer\pdfinterp.py", line 846, in render_contents 
    self.execute(list_value(streams)) 
    File "E:\Miniconda2\envs\contact2E\lib\site-packages\pdfminer\pdfinterp.py", line 876, in execute 
    raise PDFInterpreterError('Unknown operator: %r' % name) 
PDFInterpreterError: Unknown operator: '\x00' 

これは認識できないエラーですか?私は、問題はpdfが応答に埋め込まれていて、pdfminerによって正しく解析されていない可能性があると考えました。

+0

申し訳ありませんが、いいえ、私はpdfminerを使用している時代には、灰色の毛があります。 それで早く働いたのですか?同じインストールで、同じresponse.body? – ahed87

+0

ディスクに保存するとpdfを開くことはできますか?ソースを簡単に見てみると、解析対象のメソッドを認識できないときにエラーが発生し、不正な形式のpdfや特定のバージョンのマイナーがpdf-dialectをサポートしていないことがわかります。 – ahed87

+0

ありがとう私は維持に最も近いと思われるpdfminer.sixに切り替えました。私はエラーを取得していないが、私も私のPDFを解析することはできません。私はすぐにフォローアップの質問を書くでしょう。 – user61629

答えて

1

使用

from io import StringIO 
file_like = StringIO(your_string) 

あなたはPY3にしている場合、PY2もたStringIOを持っていますが、別のインポートと。 実際にバイトがある場合(投稿された例ではb ''はありません)、使用するアナログBytesIOがあります。

pdf片方向解析は、pdfminerですが、py3を実行している場合は、pdfminer-sixというバージョンが実行可能です。 pdfminerの使い方の例がたくさんあります。 しかし、実際のpdfを保留中で、pdfで探しているものは、後で使用するために許容可能で再現性のある方法で引き出すことができる前に、灰色の毛が出る可能性があります。

ストリームリーダーをpdfminerで見つけることができない場合は、おそらくディスクに文字列を書き込んでから、pdfminerの開始点としてディスク上にpdfファイルを作成します。

+0

編集をご覧ください – user61629

関連する問題