(Windows 7 / R版本3.0.1)
命令下方及产生的错误:
> 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
如何解决此问题?
编辑我
(正如Ben所建议并描述here)
我已下载Xpdf将32位版本复制到
C:\Program Files (x86)\xpdf32
和64位版本
C:\Program Files\xpdf64
环境变量pdfinfo
和pdftotext
指的是相应的可执行文件32位(使用R 32位测试)或64位(使用R 64位测试)
编辑II
一个非常令人困惑的观察是,从一个新的会话(tm未加载)开始,单独的最后一个命令将产生错误:
> 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?
编辑III
pdf文件位于:C:\Users\Raffael\Documents
> getwd()
[1] "C:/Users/Raffael/Documents"
编辑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 :(得分: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文件的问题,摆弄PATH有点昙花一现(如果你在几台不同的计算机上工作会很烦人),所以我认为最简单,最安全的方法是使用pdf2text
作为Tony Breyal describes here致电system
。
在你的情况下,它会是(注意两组引号):
system(paste('"C:/Program Files/xpdf64/pdftotext.exe"',
'"C:/Users/Raffael/Documents/17214.pdf"'), wait=FALSE)
如果您有许多PDF文件,可以使用*apply
函数或循环轻松扩展。