首页 > 资讯 > R 语言操作 PDF 文件

R 语言操作 PDF 文件

1 qpdf 1.1 统计 PDF 文件的页数 1.2 按页拆分 PDF 文件 1.3 提取 PDF 的部分页面 1.4 合并 PDF 文件 1.5 旋转 PDF 文件 1.6 压缩 PDF 文件 2 pdftools 2.1 PDF 文档转图片 2.2 读取 PDF 的元数据 2.3 读取 PDF 文档中的文本 2.4 读取 PDF 文档中使用的字体 2.5 读取 PDF 文档中包含的附件 2.6 读取 PDF 文档中的目录 2.7 读取 PDF 文档的页面大小 3 magick 4 其它 4.1 放大 PDF 文档 4.2 生成 PDF 文档 5 运行环境

PDF 格式的示例文件 pandoc-beamer.pdf 是一个 LaTeX 编译出来的幻灯片,一共有 8 页。下面的操作都在这个文件上进行。

qpdf

统计 PDF 文件的页数

qpdf::pdf_length(input = "data/pandoc-beamer.pdf")

## [1] 8

计数正确。

按页拆分 PDF 文件

qpdf::pdf_split() 将一个含有多页的 PDF 文档逐页拆分。执行如下操作,拆分后变成 8 个 PDF 文件,每个文件是一页。

qpdf::pdf_split(input = "data/pandoc-beamer.pdf", output = "data/")

## [1] "data/_1.pdf" "data/_2.pdf" "data/_3.pdf" "data/_4.pdf" "data/_5.pdf" ## [6] "data/_6.pdf" "data/_7.pdf" "data/_8.pdf"

提取 PDF 的部分页面

设置参数 pages = c(1,3,5) 表示提取原 PDF 文档中的第 1、3 和 5 页。

qpdf::pdf_subset(input = "data/pandoc-beamer.pdf", pages = c(1,3,5), output = "data/pdf_subset.pdf")

## [1] "/Users/xiangyun/Downloads/Document/xiangyun/content/post/2025-03-17-pdf/data/pdf_subset.pdf"

合并 PDF 文件

将多个 PDF 文件合并成一个文件。

qpdf::pdf_combine( input = c("data/_1.pdf", "data/_1.pdf","data/_1.pdf"), output = "data/pdf_combine.pdf")

## [1] "/Users/xiangyun/Downloads/Document/xiangyun/content/post/2025-03-17-pdf/data/pdf_combine.pdf"

旋转 PDF 文件

将示例 PDF 文件的第 1,3,5 页旋转 90 度。

qpdf::pdf_rotate_pages( input = "data/pandoc-beamer.pdf", pages = c(1,3,5), angle = 90, output = "data/pdf_rotate_pages.pdf" )

## [1] "/Users/xiangyun/Downloads/Document/xiangyun/content/post/2025-03-17-pdf/data/pdf_rotate_pages.pdf"

压缩 PDF 文件

qpdf::pdf_compress(input = "data/pandoc-beamer.pdf", output = "data/pdf_compress.pdf")

## [1] "/Users/xiangyun/Downloads/Document/xiangyun/content/post/2025-03-17-pdf/data/pdf_compress.pdf"

pdftools

相比于 qpdf 包,pdftools 包提供更多的功能。

PDF 文档转图片

受支持的图片转化格式如下

pdftools::poppler_config()

## $version ## [1] "23.04.0" ## ## $can_render ## [1] TRUE ## ## $has_pdf_data ## [1] TRUE ## ## $has_local_font_info ## [1] TRUE ## ## $supported_image_formats ## [1] "png" "jpeg" "jpg" "tiff" "pnm"

将 PDF 文档中的部分页面转化为图片

pdftools::pdf_convert( pdf = "data/pandoc-beamer.pdf", pages = c(1, 3, 5), format = "png", # supported_image_formats dpi = 72, # 值越大图片越清晰 filenames = c("data/pdf_convert_1.png", "data/pdf_convert_2.png", "data/pdf_convert_3.png") )

## Converting page 1 to data/pdf_convert_1.png... done! ## Converting page 3 to data/pdf_convert_2.png... done! ## Converting page 5 to data/pdf_convert_3.png... done!

## [1] "data/pdf_convert_1.png" "data/pdf_convert_2.png" "data/pdf_convert_3.png"

读取 PDF 的元数据

PDF 文档有自己的元数据,元数据中记录了谁什么时间用什么软件创建的等信息。

pdftools::pdf_info(pdf = "data/pandoc-beamer.pdf")

## $version ## [1] "1.5" ## ## $pages ## [1] 8 ## ## $encrypted ## [1] FALSE ## ## $linearized ## [1] FALSE ## ## $keys ## $keys$Author ## [1] "张三, 李四" ## ## $keys$Title ## [1] "Quarto 幻灯片模版" ## ## $keys$Subject ## [1] "" ## ## $keys$Creator ## [1] "LaTeX via pandoc" ## ## $keys$Keywords ## [1] "" ## ## $keys$Producer ## [1] "LuaTeX-1.17.0" ## ## $keys$Trapped ## [1] "" ## ## $keys$PTEX.FullBanner ## [1] "This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)" ## ## ## $created ## [1] "2023-09-01 23:37:06 CST" ## ## $modified ## [1] "2023-09-01 23:37:06 CST" ## ## $metadata ## [1] "" ## ## $locked ## [1] FALSE ## ## $attachments ## [1] FALSE ## ## $layout ## [1] "no_layout"

读取 PDF 文档中的文本

分页提取 PDF 文档中的文本数据,返回一个与 PDF 文档页数相同的字符串向量。

pdftools::pdf_text(pdf = "data/pandoc-beamer.pdf")

## [1] "In the morning In the eveningnnnnn Quarto 幻灯片模版nn 张三 李四nn XX 大学nn XX 学院n" ## [2] "In the morning In the eveningnnnn 目录 In In the morningnnn In the eveningn" ## [3] "In the morning In the eveningnnnnn In the morningn" ## [4] "In the morning In the eveningnnnn Getting upnnnnn • Turn off alarmn • Get out of bedn" ## [5] "In the morning In the eveningnnnn Breakfastnnnnn • Eat eggsn • Drink coffeen" ## [6] "In the morning In the eveningnnnnn In the eveningn" ## [7] "In the morning In the eveningnnnn Dinnernnnnn • Eat spaghettin • Drink winen" ## [8] "In the morning In the eveningnnnn Going to sleepnnnnn • Get in bedn • Count sheepn"

可见返回 8 个字符串,每个字符串的内容来自 PDF 文档的相应页面。

读取 PDF 文档中使用的字体

pdftools::pdf_fonts(pdf = "data/pandoc-beamer.pdf")

## name type embedded file ## 1 VSAGHM+LMSans10-Bold cid_type0c TRUE ## 2 CESELI+FandolHei-Bold cid_type0c TRUE ## 3 RLLOJF+FandolHei-Regular cid_type0c TRUE ## 4 FBPCKK+LMSans8-Regular cid_type0c TRUE ## 5 ALCPBK+LatinModernMath-Regular cid_type0c TRUE ## 6 UNGCGM+LMSans10-Regular cid_type0c TRUE

读取 PDF 文档中包含的附件

pdftools::pdf_attachments(pdf = "data/pandoc-beamer.pdf")

## list()

我的这个示例文件不含附件

读取 PDF 文档中的目录

pdftools::pdf_toc(pdf = "data/pandoc-beamer.pdf")

## $title ## [1] "" ## ## $children ## $children[[1]] ## $children[[1]]$title ## [1] "In the morning" ## ## $children[[1]]$children ## list() ## ## ## $children[[2]] ## $children[[2]]$title ## [1] "In the evening" ## ## $children[[2]]$children ## list()

读取 PDF 文档的页面大小

pdftools::pdf_pagesize(pdf = "data/pandoc-beamer.pdf")

## top right bottom left width height ## 1 0 362.8 272.1 0 362.8 272.1 ## 2 0 362.8 272.1 0 362.8 272.1 ## 3 0 362.8 272.1 0 362.8 272.1 ## 4 0 362.8 272.1 0 362.8 272.1 ## 5 0 362.8 272.1 0 362.8 272.1 ## 6 0 362.8 272.1 0 362.8 272.1 ## 7 0 362.8 272.1 0 362.8 272.1 ## 8 0 362.8 272.1 0 362.8 272.1

示例文档一共 8 页,每页的长宽都一样大。示例文档是一个 LaTeX 制作的 beamer 幻灯片,长宽比为 4:3,正好是 362.8 / 272.1 = 4/3.

magick

magick 包配合 tesseract 包可以做 OCR 识别,比如提取 PDF(扫描图片) 或图片文件中的文本。国家统计局的统计年鉴是以 JPEG 格式的图形发布的。为了快一点整理数据,我用到了 OCR 识别。

library(magick)

## Linking to ImageMagick 7.1.1.38 ## Enabled features: fontconfig, freetype, ghostscript, heic, lcms, raw, webp ## Disabled features: cairo, fftw, pango, rsvg, x11

## Using 11 threads

input <- image_read("data/C02-26.jpeg") # 去掉背景 text <- input %>% image_resize("2000x") %>% image_convert(type = 'Grayscale') %>% image_trim(fuzz = 40) %>% image_write(format = 'png', density = '300x300') # OCR 识别 text_ocr <- text %>% tesseract::ocr() # 输出文本(主要是数字) cat(text_ocr,sep = "\n")

## 2-26 FHKE AIT ISS RUALCM BAO (2020) ## b2R XB MBAOA ## “A x WA B x ADRS Es x ## %) ## ## 2B 1156394786 586822815 569571971 37750200 9518082 28232118 3.26 1.62 4.96 ## dt me 19301588 9847962 9453626 172244 38270 133974 0.89 0.39 1.42 ## KX # 11997953 6162151 5835802 169973 41646 128327 1.42 0.68 2.20 ## sl 4k 59521267 29691311 29829956 1128423 260881 867542 1.90 0.88 2.91 ## & 29205721 14857263 14348458 422524 123823 298701 1.45 0.83 2.08 ## ARA 20671482 10519559 10151923 793074 216560 576514 3.84 2.06 5.68 ## Ne ap 37853468 18801024 19052444 382208 105686 276522 1.01 0.56 1.45 ## a at 21254730 10556023 10698707 321318 96020 225298 1.51 0.91 241 ## PHL 28563622 14253881 14309741 437943 132119 305824 1.53 0.93 2.14 ## + 8 22434599 11600663 10833936 401585 81132 320453 1.79 0.70 2.96 ## I 71856068 36156582 35699486 2211291 460758 1750533 3.08 1.27 4.90 ## af I 55885807 29069882 26815925 1754402 437933 1316469 3.14 1.51 4.91 ## zh 49284489 24775087 24509402 2739952 668212 2071740 5.56 2.70 8.45 ## ia 2 33514861 17115416 16399445 970202 174482 795720 2.89 1.02 4.85 ## a) 35266271 17908471 17357800 876897 179241 697656 249 1.00 4.02 ## wy FR 82464815 41142117 41322698 3308280 735197 2573083 4.01 1.79 6.23 ## a 76376565 37582340 38794225 2228594 544348 1684246 2.92 1.45 4.34 ## $A dk 48332080 24601435 23730645 1341340 294484 1046856 2.78 1.20 441 ## 4h 53475342 27071624 26403718 1137340 287428 849912 2.13 1.06 3.22 ## DOR 102262628 54125030 48137598 1826344 394059 1432285 1.79 0.73 2.98 ## a) 38284303 19595172 18689131 1188381 248888 939493 3.10 1.27 5.03 ## 88 8067507 4244519 3822988 327406 77970 249436 4.06 1.84 6.52 ## BRK 26955796 13541057 13414739 521169 138879 382290 1.93 1.03 2.85 ## Jil 70203754 35298112 34905642 3330733 954914 2375819 4.74 2.71 6.81 ## BON 29320110 14772958 14547152 2574322 604189 1970133 8.78 4.09 13.54 ## zB 37971803 19601151 18370652 2193281 641814 1551467 5.78 3.27 8.45 ## Ae 2753235 1457393 1295842 773442 297954 475488 28.09 20.44 36.69 ## BE 32676794 16632837 16043957 1088905 313163 775742 3.33 1.88 4.84 ## HOR 20166288 10168955 9997333 1680299 474829 1205470 8.33 467 12.06 ## #8 4691001 2398640 2292361 470197 147534 322663 10.02 6.15 14.08 ## 7s 5734650 2906355 2828295 291030 77018 214012 5.07 2.65 7.57 ## iE 20046189 10367845 9678344 687101 268651 418450 3.43 2.59 4.32 ## S$: RE“VWBAO” HSS Bisse EHXOSROSPRDAOS

最后,边核对边手动整理一下,去掉一些乱码。

其它

放大 PDF 文档

用 LaTeX 放大 pdf 文档,使用场景是将一些电子版书籍去掉白边、适当放大,在电子设备上观看起来体验更好。

documentclass[a4paper,12pt]{report} usepackage[final]{pdfpages} begin{document} includepdf[pages=19-26, scale=1.3, delta=0mm 5mm, frame]{quarto-chinese.pdf} end{document}

生成 PDF 文档

编辑 PDF 中的文本和图像。

LaTeX 源码编辑(LaTeX 语法) Makdown + Pandoc + LaTeX (Markdown 语法) R Markdown / R Sweave(R Markdown 语法) 写轮眼 / pagedown 网页转化(R Markdown 语法) Office Word / PowerPoint 转化

运行环境

R 软件及 R 包的版本信息

sessionInfo(package = c( "qpdf", "pdftools", "magick" ))

## R version 4.4.3 (2025-02-28) ## Platform: x86_64-apple-darwin20 ## Running under: macOS Sequoia 15.3.2 ## ## Matrix products: default ## BLAS: /Library/Frameworks/R.framework/Versions/4.4-x86_64/Resources/lib/libRblas.0.dylib ## LAPACK: /Library/Frameworks/R.framework/Versions/4.4-x86_64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.0 ## ## locale: ## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 ## ## time zone: Asia/Shanghai ## tzcode source: internal ## ## attached base packages: ## character(0) ## ## other attached packages: ## [1] qpdf_1.3.4 pdftools_3.5.0 magick_2.8.5 ## ## loaded via a namespace (and not attached): ## [1] cli_3.6.4 knitr_1.49 rlang_1.1.5 xfun_0.51 ## [5] promises_1.3.2 jsonlite_1.9.1 tesseract_5.2.2 askpass_1.2.1 ## [9] htmltools_0.5.8.1 httpuv_1.6.15 sass_0.4.9 methods_4.4.3 ## [13] rappdirs_0.3.3 datasets_4.4.3 rmarkdown_2.29 evaluate_1.0.3 ## [17] jquerylib_0.1.4 fastmap_1.2.0 yaml_2.3.10 lifecycle_1.0.4 ## [21] utils_4.4.3 bookdown_0.42 compiler_4.4.3 Rcpp_1.0.14 ## [25] rstudioapi_0.17.1 base_4.4.3 stats_4.4.3 graphics_4.4.3 ## [29] later_1.4.1 blogdown_1.20 digest_0.6.37 R6_2.6.1 ## [33] servr_0.32 magrittr_2.0.3 bslib_0.9.0 tools_4.4.3 ## [37] grDevices_4.4.3 cachem_1.1.0

相关知识

在阅读中促进婴幼儿语言能力的发展.pdf全文
详解R语言中生存分析模型与时间依赖性ROC曲线可视化
德昂族语言文字
言语治疗,其他图文简介
语言的生命在于应用——简评《语言文字应用研究》丛书
已知R[EAX]=80706050H,R[EBX]=40302010H,R[ED
语言软件哪个好
免费语言学习软件
4.3 婴儿言语的发展
必备语言学习App推荐

网址: R 语言操作 PDF 文件 https://m.trfsz.com/newsview1651821.html