2011-07-29 12 views
11

PDF'yi metne dönüştürmek için PDFminer'dan pdf2text kullandım. Ne yazık ki özel karakterler içeriyor. benim konsolaPython: Sorunlarımı veren özel karakterler (PDFminer'den)

>>>a=pdf_to_text("ap.pdf") 
heres

bunun bir örneği, biraz kesik

>>>a[5000:5500] 
'f one architect. Decades ...... but to re\xef\xac\x82ect\none set of design ideas, than to have one that contains many\ngood but independent and uncoordinated ideas.\n1 Joshua Bloch, \xe2\x80\x9cHow to Design a Good API and Why It Matters\xe2\x80\x9d, G......=-3733' 

Ben o

>>>a[5000:5500].encode('utf-8') 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 237: ordinal not in range(128) 

Ben biraz etrafında arandı kodlamak gerektiğini anladı ve çıktı gösterelim onları denedim, özellikle Replace special characters in python. Giriş PDFminer'den geliyor, bu yüzden bunu kontrol etmek için sert (AFAIK). Bu çıktıdan uygun düz metin yapmanın yolu nedir?

Neyi yanlış yapıyorum?

-A hızlı düzeltme: ASCII için PDFminer en codec değiştirmek ama codec'i değişen cevaplayan için kalıcı bir solution--

--Abandoned hızlı düzeltme değil kaldırır bilgi -

Maxim http://en.wikipedia.org/wiki/Windows-1251 tarafından belirtildiği gibi

-AS relavent konu - ASCII olmayan metin str nesneler saklandığı zaman

+0

teşekkürler! Python'da yeni başlayanlar arasında Pdfminer'ın nasıl kullanıldığını bir demo kodu yayınlayabilirdiniz, böylece bu hatalar görünmüyor mu? Teşekkürler –

cevap

10

Bu sorun genellikle oluşur. Yapmaya çalıştığınız, utf-8 kodlamasında kodlanmış olan bir dizgiyi kodlamaktır (çünkü 0x7f'un üstünde kodları olan karakterleri içerir). 'da böyle bir dizgiyi kodlamak için, önce kodu çözülmelidir. Orijinal metin kodlama olduğunu varsayarsak cp1251 (gerçek kodlama ile değiştirin), gibi bir şey hile yapacağını şu:

u = s.decode('cp1251') # decode from cp1251 byte (str) string to unicode string 
s = u.encode('utf-8') # re-encode unicode string to utf-8 byte (str) string 

Temelde, yukarıdaki pasajı ondan dize dönüştürür yani iconv --from-code=CP1251 --to-code=UTF-8 komut, ne yapar biri diğerine kodluyor.

Bazı yararlı linkler: Bu soru için

+0

Evet, bu kusursuz çalışmaya yakın! "... ЂѲЂњDelivering Custo .." gibi bir kaç eseri var ama maksimum glitz için amatörler tarafından yapılan bir PDF oldu. Temizleyici PDF'ler temiz bir şekilde ayrıştırılmıştır. – aitchnyu

+0

Güzel olan, giriş kodlamanızı bilmeniz gerekiyor. –

+0

Kesinlikle bir "kod" ('cp1250'). Kodlayın ('utf-8') 'olarak yazarım. –