2013-07-31 3 views
5

(Windows 7/R версия 3.0.1)Ошибка при чтении PDF с помощью readPDF из пакета тм

Ниже команд и результирующая ошибка:

> library(tm) 
> pdf <- readPDF(PdftotextOptions = "-layout") 
> dat <- pdf(elem = list(uri = "17214.pdf"), language="de", id="id1") 

Error in file(con, "r") : cannot open the connection 
In addition: Warning message: 
In file(con, "r") : 
    cannot open file 'C:\Users\Raffael\AppData\Local\Temp 
    \RtmpS8Uql1\pdfinfo167c2bc159f8': No such file or directory 

Как решить эту проблему ?


EDIT Я

(Как предложил Бен и описал here)

Я скачал Xpdf скопировано 32-битную версию для C:\Program Files (x86)\xpdf32 и 64-битной версии для C:\Program Files\xpdf64

Переменные окруженияи pdftotext имеют в виду соответствующих исполняемых файлов либо 32-х (проверено с R 32 бита) или в 64-битной (протестированы с R 64 бит)


РЕДАКТИРОВАТЬ II

Один очень запутанным наблюдение состоит в том, что, начиная с свежая сессия (тм не загружен) одна последняя команда произведет ошибку:

> dat <- pdf(elem = list(uri = "17214.pdf"), language="de", id="id1") 

Error in file(con, "r") : cannot open the connection 
In addition: Warning message: 
In file(con, "r") : 
    cannot open file 'C:\Users\Raffael\AppData\Local\Temp\RtmpKi5GnL 
    \pdfinfode8283c422f': No such file or directory 

Я не понимаю, это вовсе не потому, что переменная функция не определяемый tm.readPDF. Ниже вы найдете функцию PDF относится к «естественным» и к тому, что возвращается tm.readPDF:

> pdf 

function (elem, language, id) 
{ 
    meta <- tm:::pdfinfo(elem$uri) 
    content <- system2("pdftotext", c(PdftotextOptions, shQuote(elem$uri), 
     "-"), stdout = TRUE) 
    PlainTextDocument(content, meta$Author, meta$CreationDate, 
     meta$Subject, meta$Title, id, meta$Creator, language) 
} 
<environment: 0x0674bd8c> 

> library(tm) 
> pdf <- readPDF(PdftotextOptions = "-layout") 
> pdf 

function (elem, language, id) 
{ 
    meta <- tm:::pdfinfo(elem$uri) 
    content <- system2("pdftotext", c(PdftotextOptions, shQuote(elem$uri), 
     "-"), stdout = TRUE) 
    PlainTextDocument(content, meta$Author, meta$CreationDate, 
     meta$Subject, meta$Title, id, meta$Creator, language) 
} 
<environment: 0x0c3d7364> 

Видимо нет никакой разницы - то зачем использовать readPDF вообще?


EDIT III

Файл PDF находится здесь: C:\Users\Raffael\Documents

> getwd() 
[1] "C:/Users/Raffael/Documents" 

EDIT IV

Первая инструкция в pdf() призыв к tm:::pdfinfo() - и ошибка вызвана в течение первых нескольких строк:

> outfile <- tempfile("pdfinfo") 
> on.exit(unlink(outfile)) 
> status <- system2("pdfinfo", shQuote(normalizePath("C:/Users/Raffael/Documents/17214.pdf")), 
+     stdout = outfile) 
> tags <- c("Title", "Subject", "Keywords", "Author", "Creator", 
+   "Producer", "CreationDate", "ModDate", "Tagged", "Form", 
+   "Pages", "Encrypted", "Page size", "File size", "Optimized", 
+   "PDF version") 
> re <- sprintf("^(%s)", paste(sprintf("%-16s", sprintf("%s:", 
+              tags)), collapse = "|")) 
> lines <- readLines(outfile, warn = FALSE) 
Error in file(con, "r") : cannot open the connection 
In addition: Warning message: 
In file(con, "r") : 
    cannot open file 'C:\Users\Raffael\AppData\Local\Temp\RtmpquRYX6\pdfinfo8d419174450': No such file or direc 

Видимо tempfile() просто не создает файл.

> outfile <- tempfile("pdfinfo") 
> outfile 
[1] "C:\\Users\\Raffael\\AppData\\Local\\Temp\\RtmpquRYX6\\pdfinfo8d437bd65d9" 

C:\Users\Raffael\AppData\Local\Temp\RtmpquRYX6 Папка существует и имеет некоторые файлы, но ни один не назван pdfinfo8d437bd65d9.

+0

У вас есть правильно настроенный pdf2txt 'PATH'? См. Здесь подробности: https://stat.ethz.ch/pipermail/r-help/2008-November/180201.html – Ben

+0

, пожалуйста, посмотрите на отредактированный вопрос – Raffael

ответ

4

межжала, на моей машине после того, как новый старт pdf функция для преобразования изображения в формате PDF:

getAnywhere(pdf) 
A single object matching ‘pdf’ was found 
It was found in the following places 
    package:grDevices 
    namespace:grDevices [etc.] 

Но вернемся к проблеме чтения в PDF файлов в виде текста, теребя Траектория бит и промах (и раздражает, если вы работаете на нескольких разных компьютерах), поэтому я считаю, что самым простым и безопасным методом является вызов pdf2text с использованием system как Tony Breyal describes here.

В вашем случае это будет (обратите внимание на два набор кавычек):

system(paste('"C:/Program Files/xpdf64/pdftotext.exe"', 
      '"C:/Users/Raffael/Documents/17214.pdf"'), wait=FALSE) 

Это может быть легко расширен с *apply функции или циклом, если у вас есть много PDF-файлов.

+0

простой обходной путь. почему нет. кажется, есть несколько вопросов. Прежде всего, tempfile не создает файл. Я перезаписал его, используя файл file.create, а затем столкнулся с дополнительными проблемами. Это не стоит хлопот. – Raffael

+0

Да, извините, это не относится к сложностям, которые вы раскрыли, но он выполняет свою работу. – Ben