2013-07-31 8 views
5

(Windows 7/R w wersji 3.0.1)Błąd próby odczytu pliku PDF za pomocą readPDF z pakietu tm

Poniżej poleceń i powstały błąd:

> 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 

Jak mogę rozwiązać ten problem ?


EDIT I ​​

(Jak sugeruje Ben i opisane here)

Pobrałem Xpdf kopiowane z wersji 32-bitowej do C:\Program Files (x86)\xpdf32 i wersji 64-bitowej do C:\Program Files\xpdf64

Zmienne środowiskowei pdftotext odnoszą się do odpowiednich plików wykonywalnych albo 32-bitowej (testowane z R 32-bitowej) lub 64-bitowego (testowane z R 64-bitowej)


Edycja II

Jeden bardzo kłopotliwe obserwacji jest to, że wychodząc z świeże sesji (tm nie załadowany) ostatnie polecenie sam będzie produkować błąd:

> 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 

ja tego nie rozumiem w ogóle, ponieważ zmienna funkcja nie jest zdefiniowane przez tm.readPDF jeszcze. Poniżej znajdziesz funkcja pdf odnosi się do „naturalnie” i co jest zwracane przez 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> 

Widocznie nie ma różnicy - to dlaczego użycie readPDF w ogóle?


EDIT III

pliku PDF znajduje się tutaj: C:\Users\Raffael\Documents

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

EDIT IV

pierwszej instrukcji w pdf() jest wezwaniem do tm:::pdfinfo() - a tam błąd jest spowodowany w ciągu pierwszych kilku liniach:

> 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 

Widocznie tempfile() po prostu nie tworzy pliku.

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

Folder C:\Users\Raffael\AppData\Local\Temp\RtmpquRYX6 istnieje i posiada kilka plików, ale żaden nazywa pdfinfo8d437bd65d9.

+0

Czy masz poprawnie skonfigurowaną "PATH" pdf2txt? Zobacz tutaj, aby uzyskać szczegółowe informacje: https://stat.ethz.ch/pipermail/r-help/2008-November/180201.html – Ben

+0

, proszę spojrzeć na zredagowane pytanie – Raffael

Odpowiedz

4

ciekawych, na moim komputerze po świeżej początku pdf jest funkcja konwersji obrazu do formatu PDF:

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

Ale wracając do problemu czytania w plikach PDF jako tekst, bawiąc ścieżka jest trochę chybione (i denerwujące, jeśli pracujesz na kilku różnych komputerach), więc myślę, że najprostszą i najbezpieczniejszą metodą jest wywołanie pdf2text przy użyciu system jako Tony Breyal describes here.

W twoim przypadku byłoby (zwrócić uwagę na dwa zestawy cytatów):

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

ten można łatwo rozszerzyć za pomocą funkcji *apply lub pętli, jeśli masz wiele plików PDF.

+0

proste obejście. Dlaczego nie. wygląda na to, że jest kilka problemów. przede wszystkim tempfile nie tworzy pliku. Nadpisałem go za pomocą file.create, a następnie napotkałem kolejne problemy. To nie jest warte kłopotów. – Raffael

+0

Tak, przykro mi, że nie rozwiązuje problemów, które ujawniłeś, ale wykonuje to zadanie. – Ben

Powiązane problemy