2013-07-31 33 views
5

(Windows 7/R phiên bản 3.0.1)Lỗi cố gắng để đọc một PDF bằng cách sử readPDF từ gói tm

Dưới các lệnh và các lỗi dẫn đến:

> 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 

Làm thế nào để giải quyết vấn đề này ?


EDIT Tôi

(Theo đề nghị của Ben và mô tả here)

tôi tải Xpdf sao chép phiên bản 32bit để C:\Program Files (x86)\xpdf32 và phiên bản 64bit để C:\Program Files\xpdf64

Các biến môi trường pdfinfopdftotext đang đề cập đến thực thi hoặc 32bit (thử nghiệm với R 32bit) hoặc 64bit tương ứng (thử nghiệm với R 64bit)


EDIT II

Một quan sát rất khó hiểu là bắt đầu từ một phiên mới (tm không được tải) lệnh cuối cùng một mình sẽ tạo ra lỗi:

> 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 

Tôi không hiểu điều này chút nào vì biến chức năng không phải là được định nghĩa bởi tm.readPDF. Dưới đây bạn sẽ thấy hàm pdf đề cập đến "một cách tự nhiên" và những gì được trả về bởi 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> 

Rõ ràng là không có sự khác biệt - vậy tại sao lại sử dụng readPDF?


EDIT III

Các tập tin pdf nằm ở đây: C:\Users\Raffael\Documents

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

EDIT IV

hướng dẫn đầu tiên trong pdf() là một lời kêu gọi tm:::pdfinfo() - và có lỗi gây ra trong vòng vài dòng đầu tiên:

> 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 

Rõ ràng tempfile() chỉ đơn giản là không tạo ra một tập tin.

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

Thư mục C:\Users\Raffael\AppData\Local\Temp\RtmpquRYX6 tồn tại và giữ một số tệp nhưng không có tên nào là pdfinfo8d437bd65d9.

+0

Bạn đã định cấu hình pdf2txt 'PATH' đúng chưa? Xem tại đây để biết chi tiết: https://stat.ethz.ch/pipermail/r-help/2008-November/180201.html – Ben

+0

vui lòng xem câu hỏi đã chỉnh sửa – Raffael

Trả lời

4

intersting, trên máy tính của tôi sau một khởi đầu mới pdf là một chức năng để chuyển đổi một hình ảnh sang PDF:

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

Nhưng trở lại vấn đề đọc trong các tập tin PDF dưới dạng văn bản, loay hoay với PATH là một chút hit-and-miss (và gây phiền nhiễu nếu bạn làm việc trên một số máy tính khác nhau), vì vậy tôi nghĩ rằng phương pháp đơn giản và an toàn nhất là gọi pdf2text sử dụng systemTony Breyal describes here.

Trong trường hợp của bạn nó sẽ là (chú ý hai bộ dấu ngoặc kép):

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

Điều này có thể dễ dàng được mở rộng với một *apply chức năng hoặc vòng lặp nếu bạn có nhiều tập tin PDF.

+0

giải pháp đơn giản. tại sao không. có vẻ như có một số vấn đề. đầu tiên của tất cả tempfile không phải là tạo ra một tập tin. Tôi ghi đè nó bằng cách sử dụng file.create và sau đó phải đối mặt với các vấn đề khác. Nó không có giá trị phức tạp. – Raffael

+0

Có, xin lỗi nó không giải quyết những phức tạp bạn tiết lộ, nhưng nó có được công việc làm. – Ben

Các vấn đề liên quan