- R数据科学实战:工具详解与案例分析
- 刘健 邬书豪
- 872字
- 2023-07-18 17:12:12
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": [] ## } ## ] ## }