2017-04-01 6 views
0

私はMechanizeルビーの宝石を使ってPDFをダウンロードしていますローカルファイルシステムに保存します。Ruby - PDFファイルにEOFマーカーを追加する、または他の方法でバイパスする方法:: Reader :: MalformedPDFError:PDFにEOFマーカーが含まれていません

URL = "www.my-site.com" 
agent = Mechanize.new 
agent.pluggable_parser.pdf = Mechanize::File # FYI I have also tried Mechanize::FileSaver and Mechanize::Download here 

page = agent.get(URL) 
form = page.forms.first 
button = page.form.button_with(:value => "Some Button Text") 

local_file = "path/to/file.pdf" 
response = agent.submit(form, button) 
response.save_as(local_file) 

しかし、私はPDF::Reader宝石を使用して、このPDFファイルを読み込むしようとすると、私はエラー「PDFは、EOFマーカーが含まれていません」を取得します。

reader = PDF::Reader.new(local_file) # this also happens if I try to use PDF::Reader.new(response.body) and PDF::Reader.new(response.body_io) depending on the different pluggable_parser configurations mentioned above 
#> PDF::Reader::MalformedPDFError: PDF does not contain EOF marker 

私はローカルでPDFを保存し、それを表示することができるよ、それは正常に見えるが、PDF::Reader逸品EOFマーカーを逃すそれについて不平を言っています。

私の質問は、PDFに解析するために、このエラーを回避するためにPDFに何かを追加する方法があるのでしょうか?

ありがとうございました。

関連(未回答)質問:PDF does not contain EOF marker (PDF::Reader::MalformedPDFError) with pdf-reader

関連ドキュメント:

EDIT:

私はどこかに私が取り払う方法を見つけ出すように見えることはできませんいくつかのHTMLに見えるものに続いてダウンロードしたファイルの内容の途中でEOFマーカーを発見しました。私は、PDFコンテンツを分離し、それを解析したいが、依然として問題にぶつかっている。ここでは、完全なスクリプトである私が使用しています: https://gist.github.com/s2t2/c6766846d024edd696586b2bc7fee0bf

+0

はあなただけで、文書の最後にEOFを追加しようとしたことがありますか? –

+0

どうすればいいですか? – s2t2

+0

最良の方法は、保存されているコンテンツ( 'response.save(local_file)')を再考することですが、別のRubyリーダー(つまり、CombinePDFやpdftkベースのリーダー)でPDFを開いて、彼らはエラーを克服することができます...それは動的にそれを修正するよりもエラーがない方が良いです。 – Myst

答えて

0

を問題は、あなたがアクセスしているウェブサイトであるように思わ:http://employmentsummary.abaquestionnaire.org

応答の最後にHTMLデータを追加します。

ただし、最初の部分文字列%EOFを検索し、それ以降のすべてのデータを削除すると、応答を切り捨てることができます。

すなわち:

pdf_data = result.body 
pdf_data.slice!(0, pdf_data.index("%EOL").to_i + 4) 
if(pdf_data.length <= 4) 
    # handle error 
else 
    # save/send pdf_data 
end 
+0

私は 'ArgumentError:string has null byte'を取得しています。私の要点に基づいて作業スクリプトを共有できますか? – s2t2

+0

@ s2t2私は現時点では自分のコンピュータから離れていますが、この問題は文字列エンコードの問題のように聞こえます。おそらく、その内容を操作する前に文字列をバイナリエンコーディングに変更しようとしますか? – Myst

関連する問題