2010-10-04 6 views
1

РЕБЯТА я разместил вопрос ранее pypdf python tool .dont маркировать это как дубликат, как я получаю эту ошибку указанные нижеUnicodeEncodeError при чтении PDF с pyPdf

import sys 
    import pyPdf 

    def convertPdf2String(path): 
     content = "" 
     # load PDF file 
     pdf = pyPdf.PdfFileReader(file(path, "rb")) 
     # iterate pages 
     for i in range(0, pdf.getNumPages()): 
      # extract the text from each page 
      content += pdf.getPage(i).extractText() + " \n" 
     # collapse whitespaces 
     content = u" ".join(content.replace(u"\xa0", u" ").strip().split()) 
     return content 

    # convert contents of a PDF file and store retult to TXT file 
    f = open('a.txt','w+') 
    f.write(convertPdf2String(sys.argv[1])) 
    f.close() 

    # or print contents to the standard out stream 
    print convertPdf2String("/home/tom/Desktop/Hindi_Book.pdf").encode("ascii", "xmlcharrefreplace") 

Я получаю эту ошибку для 1-го PDF-файл UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) и следующее сообщение об ошибке для этого PDF http://www.envis-icpe.com/pointcounterpointbook/Hindi_Book.pdf

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 38: ordinal not in range(128)

Как решить эту

+0

Вы точно выполнили код, указанный выше? 'u" \ xe7 ".encode (" ascii "," xmlcharrefreplace ")' правильно возвращает "ç". С «xmlcharrefreplace» он не должен терпеть неудачу для действительных символов Unicode. – AndiDog

ответ

2

Я попробовал это сам и получил тот же результат. Игнорируйте мой комментарий, я не видел, чтобы вы записывали вывод в файл. Это проблема:

f.write(convertPdf2String(sys.argv[1])) 

Как convertPdf2String возвращает строку Unicode, но file.write может писать только байты, вызов f.write пытается автоматически преобразовать строку Unicode в кодировке ASCII. Поскольку PDF явно содержит символы, отличные от ASCII, это терпит неудачу. Так что это должно быть что-то вроде

f.write(convertPdf2String(sys.argv[1]).encode("utf-8")) 
# or 
f.write(convertPdf2String(sys.argv[1]).encode("ascii", "xmlcharrefreplace")) 

EDIT:

Рабочий исходный код, только одна линия изменилась.

# Execute with "Hindi_Book.pdf" in the same directory 
import sys 
import pyPdf 

def convertPdf2String(path): 
    content = "" 
    # load PDF file 
    pdf = pyPdf.PdfFileReader(file(path, "rb")) 
    # iterate pages 
    for i in range(0, pdf.getNumPages()): 
     # extract the text from each page 
     content += pdf.getPage(i).extractText() + " \n" 
    # collapse whitespaces 
    content = u" ".join(content.replace(u"\xa0", u" ").strip().split()) 
    return content 

# convert contents of a PDF file and store retult to TXT file 
f = open('a.txt','w+') 
f.write(convertPdf2String(sys.argv[1]).encode("ascii", "xmlcharrefreplace")) 
f.close() 

# or print contents to the standard out stream 
print convertPdf2String("Hindi_Book.pdf").encode("ascii", "xmlcharrefreplace") 
+0

@AndiDog: я попробовал оба изначально и не смог заставить их работать. Моя первоначальная цель состояла в том, чтобы просто прочитать содержимое pd из командной строки, и я не хочу этого делать с помощью xpdf – Hulk

+0

@Hulk: Я протестировал то, что написал в моем ответе, в том же файле PDF. Вы говорите, что это не сработает для вас? – AndiDog

+0

@AndiDog: Его по-прежнему та же ошибка. Я пытался использовать оба оператора – Hulk