1.6 pdftools——PDF文件

学术期刊、网络杂志和电子书籍一般都会以PDF格式的文件呈现。一般的计量型数据分析很少会遇到读取PDF文件的情况,不过在进行文本挖掘(Text Mining)和主题模型(Topic Modelling)预测中,pdftools包绝对是必备R包之一。该包只有两个母函数,一个用来从PDF中提取数据(此处的数据包括数字型和文字型数据),另一个则用来将文件渲染成PDF格式。本节我们只讨论第一个母函数——pdf_info。

pdf_info函数下面一共包含6个子函数,功能各不相同,详见表1-15。但是6个子函数的参数完全一致,分别是pdf、opw和upw,详见表1-16。

表1-15 数据导入函数'pdf_info子函数一览

表1-16 数据导入函数'pdf_info参数详解

由于篇幅有限,下面的代码只截取了部分结果进行解释。这里所用的PDF文档是pdftools包的帮助文档,读者可以自行到R官网上搜索下载。帮助文档是开放PDF文件,无须提供密码。读取文档代码如下:

> library(pdftools)
> pdf_info(pdf = "./helpDocs/pdftools.pdf")
## $version
## [1] "1.5"
## 
## $pages
## [1] 5
...

当使用pdf_text提取文档内容时,全部内容都被提取为一个字符串向量,每页的内容都被单独放置于一个字符串中。帮助文档的PDF格式一共有包含5页,所以这里会得到一个长度为5的字符串向量。有两种方式可用于查看提取的文本:可以直接将结果显示在console中(通过执行print(text)或直接运行text),也可以通过“[]”来指定显示某一页的内容。空白的位置都会以空格的字符格式显示,“\r\n”代表换行符号。提取文档内容的代码如下:

> text<- pdf_text("./helpDocs/pdftools.pdf")
> length(text)
## [1] 5
> class(text)
## [1] "character"
> text[1]
## [1] " Package ‘pdftools’\r\nMay 27, 2018\r\nType Package\r\nTitle Text Extraction, Rendering and Converting of PDF Documents\r\nVersion 1.8\r\nDescription Utilities based on 'libpoppler' for extracting text, fonts, attachments and\r\n

该文档无附件,所以会显示一个空列表:

> pdf_attachments(pdf = "./helpDocs/pdftools.pdf")
## list()

文档中一共包含了6种字体,pdf_fonts会给出字体的名称、类型、是否嵌入文档中这三类信息,具体如下:

> pdf_fonts(pdf = "./helpDocs/pdftools.pdf")
##nametype embedded file
## 1 DSHWTW+NimbusRomNo9L-Medi type1 TRUE 
## 2 UTHPMJ+NimbusRomNo9L-Regu type1 TRUE 
## 3 DSQFGA+Inconsolata-zi4r type1 TRUE 
## 4LVIJIF+NimbusSanL-Regu type1 TRUE 
## 5 DQRZJT+NimbusRomNo9L-Regu-Slant_167 type1 TRUE 
## 6 YIECHJ+NimbusRomNo9L-ReguItal type1 TRUE

目录读取的子函数会将所读取的内容返回到一个列表中,如果直接将该列表显示在console中很可能会让人感觉不知所云,读者可以自行实践。最好的办法是将读取的内容使用jsonlite包转换成json列表的格式进行显示,以帮助理解文档的架构。jsonlite包的相关内容详见1.7节。jsonlite包转换成json列表的示例代码如下:

> jsonlite::toJSON(x = pdf_toc(pdf = "./helpDocs/pdftools.pdf"), pretty = TRUE)
## {
## "title": "",
## "children": [
## {
## "title": "pdf_info",
## "children": []
## },
## {
## "title": "pdf_render_page",
## "children": []
## },
## {
## "title": "Index",
## "children": []
## }
## ]
## }