PDF 格式的示例文件 pandoc-beamer.pdf
是一个 LaTeX 编译出来的幻灯片,一共有 8 页。下面的操作都在这个文件上进行。
1 qpdf
1.1 统计 PDF 文件的页数
qpdf::pdf_length(input = "data/pandoc-beamer.pdf")
## [1] 8
计数正确。
1.2 按页拆分 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"
1.3 提取 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"
1.4 合并 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"
1.5 旋转 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"
1.6 压缩 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"
2 pdftools
相比于 qpdf 包,pdftools 包提供更多的功能。
2.1 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"
2.2 读取 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"
2.3 读取 PDF 文档中的文本
分页提取 PDF 文档中的文本数据,返回一个与PDF文档页数相同的字符串向量。
pdftools::pdf_text(pdf = "data/pandoc-beamer.pdf")
## [1] "In the morning In the evening\n\n\n\n\n Quarto 幻灯片模版\n\n 张三 李四\n\n XX 大学\n\n XX 学院\n"
## [2] "In the morning In the evening\n\n\n\n 目录 I\n In the morning\n\n\n In the evening\n"
## [3] "In the morning In the evening\n\n\n\n\n In the morning\n"
## [4] "In the morning In the evening\n\n\n\n Getting up\n\n\n\n\n • Turn off alarm\n • Get out of bed\n"
## [5] "In the morning In the evening\n\n\n\n Breakfast\n\n\n\n\n • Eat eggs\n • Drink coffee\n"
## [6] "In the morning In the evening\n\n\n\n\n In the evening\n"
## [7] "In the morning In the evening\n\n\n\n Dinner\n\n\n\n\n • Eat spaghetti\n • Drink wine\n"
## [8] "In the morning In the evening\n\n\n\n Going to sleep\n\n\n\n\n • Get in bed\n • Count sheep\n"
可见返回 8 个字符串,每个字符串的内容来自 PDF 文档的相应页面。
2.4 读取 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
2.5 读取 PDF 文档中包含的附件
pdftools::pdf_attachments(pdf = "data/pandoc-beamer.pdf")
## list()
我的这个示例文件不含附件
2.6 读取 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()
2.7 读取 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.
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
最后,边核对边手动整理一下,去掉一些乱码。
4 其它
4.1 放大 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}
4.2 生成 PDF 文档
编辑 PDF 中的文本和图像。
- LaTeX 源码编辑(LaTeX 语法)
- Makdown + Pandoc + LaTeX (Markdown 语法)
- R Markdown / R Sweave(R Markdown 语法)
- 写轮眼 / pagedown 网页转化(R Markdown 语法)
- Office Word / PowerPoint 转化
5 运行环境
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