图片从pdf转为png

将 PDF 文件转换为 PNG 格式,在 R 和 Python 中都有很成熟的解决方案。这里我的目的是把 PDF 的一整页转为图片,而不是提取 PDF 中的图片。

📊 R 语言解决方案

在 R 中,最推荐的方法是使用 pdftools 包,它基于 libpoppler 库,能高质量地渲染 PDF 页面。

  1. 安装与加载

    1
    2
    install.packages("pdftools")
    library(pdftools)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        
    2. **方法一:`pdf_convert()` - 批量转换页面**
    这是最直接的方法,可以一次性将 PDF 的指定页面转换为 PNG 图片。(下面的参数就是需要设置的参数,其他参数不用设置)

    ```r
    # 转换 PDF 的第 1 到 3 页为 PNG,默认保存在工作目录,(会生成 xxx_1.png)
    pdf_convert("your_file.pdf", pages = 1:3, format = "png", dpi = 150)

    # 转换所有页面
    pdf_convert("your_file.pdf", format = "png", dpi = 150)
    • pages: 指定要转换的页面,NULL 表示所有页面。
  • dpi: 控制输出图片的分辨率,默认是 72,可根据需要调高。
  1. 方法二:pdf_render_page() + png::writePNG() - 精细控制 此方法先将 PDF 页面渲染为位图数组,再写入 PNG 文件,适合需要进一步处理图像数据的场景。

    1
    2
    3
    4
    5
    6
    7
    library(png) # 用于写入 PNG

    # 渲染 PDF 的第一页为一个位图数组
    bitmap <- pdf_render_page("your_file.pdf", page = 1, dpi = 300)

    # 将位图数组保存为 PNG 文件
    writePNG(bitmap, "output_page_1.png")

实际上pdf_convert() 在底层本质上是对 pdf_render_page() 的循环封装。

当你调用 pdf_convert(pages = 1:3) 时,它在内部执行了:

1
2
3
4
5
# 伪代码示意
for (i in 1:3) {
bitmap <- pdf_render_page(file, page = i, dpi = dpi)
writePNG(bitmap, paste0("page_", i, ".png"))
}

所以直接使用 pdf_convert() 函数即可。

示例代码

将工作目录下全部 pdf 转为同名的 png 的示例代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
library(pdftools)

pdf_files <- list.files(pattern = "\\.pdf$", ignore.case = TRUE)

for (pdf_file in pdf_files) {
cat("正在转换:", pdf_file, "\n")

tryCatch({
# 先正常转换(会生成 xxx_1.png)
png_files <- pdf_convert(
pdf = pdf_file,
format = "png",
dpi = 300,
antialias = TRUE,
opw = "",
upw = "",
verbose = TRUE
)

# 重命名:去掉 _1
for (png_file in png_files) {
new_name <- sub("_1\\.png$", ".png", png_file)
if (file.exists(new_name)) {
file.remove(new_name) # 如果目标文件已存在,先删除
}
file.rename(png_file, new_name)
cat("✅ 重命名:", png_file, "->", new_name, "\n")
}
cat("\n")
}, error = function(e) {
cat("❌ 转换失败:", e$message, "\n\n")
})
}

cat("===== 全部完成 =====\n")

🐍 Python 语言解决方案

Python 中有多种库可以实现,这里介绍两种最常用的。

我这里使用了方案一 pdf2image + poppler ,方案二没试。

方案一:使用 pdf2image + poppler

pdf2image 是一个专门用于将 PDF 转换为图像的库,底层同样依赖 poppler。这个包是一个“包装器”,本身不包含 PDF 渲染能力,必须调用系统安装的 Poppler 工具集来完成转换。这导致了安装步骤的复杂化。

  1. 安装

    用conda 安装 poppler

    1
    conda install -c conda-forge poppler

安装 pdf2image (我这里也是用的conda)

1
pip install pdf2image
  1. 转换代码

    一般网页展示,150 dpi 就够了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from pdf2image import convert_from_path

    # 如果 poppler 不在系统 PATH 中,需要指定路径
    # images = convert_from_path('your_file.pdf', poppler_path=r'C:\path\to\poppler\bin')

    # 转换 PDF 的所有页面,输出为一个列表,其中包含了 PDF 每一页对应的图像对象。
    images = convert_from_path('your_file.pdf', dpi=150)

    # 逐页保存为 PNG
    for i, image in enumerate(images):
    image.save(f'output_page_{i+1}.png', 'PNG')

    如果只转换第一页

    1
    2
    3
    4
    5
    6
    7
    from pdf2image import convert_from_path

    # 只转换第一页,DPI=150
    images = convert_from_path('Sites_density.pdf', dpi=150, first_page=1, last_page=1)

    # 保存第一页为 PNG
    images[0].save('Sites_density.png', 'PNG')

方案二:使用 PyMuPDF (fitz)

PyMuPDF 是一个功能强大的 PDF 处理库,速度很快,且无需额外安装系统依赖。

这个我还没有测试。

  1. 安装

    1
    pip install PyMuPDF

  2. 转换代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import fitz
    import os

    pdf_document = fitz.open("your_file.pdf")

    for page_num in range(len(pdf_document)):
    page = pdf_document[page_num]
    # 设置缩放系数,提高图片质量 (1.3333 对应 96 DPI 左右)
    zoom = 1.3333
    mat = fitz.Matrix(zoom, zoom)
    pix = page.get_pixmap(matrix=mat)

    # 保存为 PNG
    output_path = f"output_page_{page_num+1}.png"
    pix.save(output_path)

    pdf_document.close()
    在这个例子中,zoom 参数控制输出图片的分辨率,数值越大,图片越清晰,文件也越大。

⚖️ 方案对比与选择建议

维度 R (pdftools) Python (pdf2image) Python (PyMuPDF)
易用性 ⭐⭐⭐⭐⭐ (函数直接,开箱即用) ⭐⭐⭐⭐ (需额外安装poppler) ⭐⭐⭐⭐⭐ (纯Python库,安装简单)
性能 中等 非常快
依赖 无特殊系统依赖 需要系统安装 poppler 无特殊系统依赖
适用场景 R 语言环境,批量转换 PDF 页面 Python 环境,对 poppler 熟悉 Python 环境,追求高性能和简单部署

简单总结:

  • 如果你在 R 环境下工作,pdftools 是最自然、最高效的选择。
  • 如果你在 Python 环境下工作:
    • 追求简单部署和快速开发PyMuPDF 是首选。
    • 如果偏好专门的 PDF 转图像工具,可以考虑 pdf2image

需要注意的是,以上方法都是将 PDF 的整个页面渲染为图片。如果你的 PDF 内部包含独立的图片,并希望将其提取出来,则需要使用不同的方法,例如 R 的 pdfimager 包或 Python 的 PyMuPDF 提取图片功能。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2026 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信