2017-03-11 7 views
0

Python3とPopplerを使って、問題なくnew_from_fileでファイルをロードできますが、new_from_dataは問題があります。 new_from_fileは完璧に動作するので、ファイルから読み込んでnew_from_dataを使用するのは意味がないので、ここでコードは明らかに単純なテストですが、ここでpdfファイルを生成する完全なコードを投稿できませんでした。誰かがpythonでpoppler new_from_dataを使用できましたか?

from gi.repository import Poppler, Gtk 

def draw(widget, cr): 
     # set background. 
     cr.set_source_rgb(0.7, 0.6, 0.5) 
     cr.paint() 

     # set page background 
     cr.set_source_rgb(1, 1, 1) 
     cr.rectangle(0,0,800,400) 

     cr.fill() 
     page.render(cr) 

filepath = "d:/Mes Documents/A5.pdf" 
f11 = open(filepath, "r", encoding = "cp850") 
data1 = f11.read() 
f11.close() 

document = Poppler.Document.new_from_data(data1, len(data1), None) 
page = document.get_page(0) 
print (document.get_n_pages()) 


window = Gtk.Window(title="Hello World") 
window.connect("delete-event", Gtk.main_quit) 
window.connect("draw", draw) 
window.set_app_paintable(True) 

window.show_all() 
Gtk.main() 

四つの異なる状況が起こることがあります。非常に単純なPDFファイル(PDFリファレンス13で "Hello World" の一例)で

  • を、それが動作します。通常のファイルで
  • 、誤りがないかもしれないが、get_n_pages 0を返し、get_page(0)なし
  • を返していないか、私はエラーを取得することがあります。GLib.Error:のpoppler-クォーク:PDF文書が破損している(4 )
  • またはプログラムは、問題は、符号化パラメータとなる可能性がある場合、私は疑問に思う

crashsが、私は結果なしで考えるすべてのものを試してみました。

data1 = "".join(map(data1)) 

Noの結果: Iは、 "RB" と、その後で文字列にバイト配列を変換してみました。 Googleで

検索は、私は同じ問題に遭遇した実施例

答えて

1

を返されることはありません、Gio.MemoryInputStreamを使用して、それを解決しました。 本当にエレガントが、それは動作します...

from gi.repository import Poppler, Gtk, Gio 

def draw(widget, cr): 
     # set background. 
     cr.set_source_rgb(0.7, 0.6, 0.5) 
     cr.paint() 

     # set page background 
     cr.set_source_rgb(1, 1, 1) 
     cr.rectangle(0,0,800,400) 

     cr.fill() 
     page.render(cr) 

filepath = "d:/Mes Documents/A5.pdf" 
with open(filepath, "rb") as f11: 
    input_stream = Gio.MemoryInputStream.new_from_data(f11.read()) 
    # Take care that you need to call .close() on the Gio.MemoryInputStream once you're done with your pdf document. 

document = Poppler.Document.new_from_stream(input_stream, -1, None, None) 
page = document.get_page(0) 
print (document.get_n_pages()) 


window = Gtk.Window(title="Hello World") 
window.connect("delete-event", Gtk.main_quit) 
window.connect("draw", draw) 
window.set_app_paintable(True) 

window.show_all() 
Gtk.main() 
+0

おかげではない、@Trapは、それが正常に動作しませんが、1つのポイントについて:Gio.MemoryInputStreamの.close()を呼び出してメモリを解放しない、どちらもデルを行います。私はPdfページを表示するためにこのコードを使用するので、閲覧される各ページはメモリ使用量を増加させ、ギガバイトで終了する可能性があります。 – Dysmas

+0

それは奇妙なことですが、ドキュメントはclose()の目的に関してかなり明白です。実際には、ドキュメントを正しく理解していれば、ストリームオブジェクトがガベージコレクションされたらストリームのリソースを解放する必要があるため、呼び出す必要はありません。 http://lazka.github.io/pgi-docs/#Gio-2.0/classes/InputStream.html#Gio.InputStream.close – Trap

+0

私はテストコードを新しい質問に投稿しました:https://stackoverflow.com/questions/45838863/gio-memoryinputstream-do-not-free-memory-closed-closed/45869003#45869003。その答えはバグだと説明し、バグに悩まされているnew_from_dataの代わりにnew_from_bytesを使うことを推奨しています。テストされて、それは動作します。 – Dysmas

関連する問題