夜雨聆风学习资料网

ARTICLE · 1058459

PDF机制图转→TIFF格式且保证300dpi质量

PDF机制图转→TIFF格式且保证300dpi质量
相信很多人投稿都更偏好TIFF格式吧,那么从biorender上制作完成的pdf格式图如何安全转换到TIFF格式,且满足:1.300dpi质量;2.嵌入文字不损失呢?下面提供几种零软件安装的简便操作方法:

我为你整理了 R、Python、Matlab 和 Java 这四种语言的实现方案,你可以看看哪种更适合你。

一、Python 方案:生态丰富,选择多样

Python 有多个库可以实现这个功能,从开源到商业库都有,选择很灵活。

开源方案 (PyMuPDF+Pillow):这是一个轻量且强大的组合。PyMuPDF 负责将 PDF 页面高质量地渲染为图像,Pillow 则用于将图像保存为 TIFF 格式。

首先,pip install pymupdf Pillow

import fitz  PyMuPDFfrom PIL import Image# 打开PDF文件doc = fitz.open("input.pdf")# 遍历每一页for page_num in range(len(doc)):    page = doc.load_page(page_num)    # 将页面渲染为Pixmap(图像)    pix = page.get_pixmap(dpi=300)  # 可以设置DPI    # 将Pixmap转换为PIL Image对象    img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)    # 保存为TIFF    img.save(f"output_page_{page_num + 1}.tiff")doc.close()

二、 R 方案:pdftools 包,简洁高效

R 语言用户可以使用pdftools包,它基于强大的libpoppler库,能够高质量地将 PDF 渲染为 TIFF 格式。

library(pdftools)将PDF的每一页分别转换为TIFF文件pdf_convert("input.pdf", format = "tiff", dpi = 300)# 或者,将指定页转换为TIFF# pdf_convert("input.pdf", format = "tiff", pages = 1:3, dpi = 300)
安装:install.packages("pdftools")(该包依赖libpoppler系统库,在 Linux 上通常需要安装libpoppler-cpp-dev)

三、Matlab 方案:利用内置图像处理函数

Matlab 可以通过imread读取 PDF 的首页为图像,然后用imwrite将其保存为 TIFF,同时可以指定分辨率。

% 读取PDF的第一页pdfData = imread('input.pdf');% 将图像保存为TIFF格式,并指定分辨率为600 DPIimwrite(pdfData, 'output.tif''Resolution'600);

注意:这种方法默认只转换 PDF 的第一页。如果需要处理多页 PDF,需要结合其他方法逐页读取。

四、Java 方案:Apache PDFBox 或 pdf2tiff 工具

Java 生态中,Apache PDFBox是一个成熟的开源选择,可以将 PDF 页面渲染为图像,再通过 ImageIO 保存为 TIFF-。此外,还有一个专门封装好的开源工具pdf2tiff,使用起来更便捷,它底层也依赖 PDFBox。

使用pdf2tiff工具(推荐)

import io.github.pdf2tiff.Pdf2Tiff;import io.github.pdf2tiff.ImageType;// 一行代码即可完成转换Pdf2Tiff.INSTANCE.pdf2Tiff("my.pdf""my.tiff"300"Deflate"ImageType.RGB);

Maven 依赖:

<dependency>    <groupId>io.github.pdf2tiff</groupId>    <artifactId>pdf2tiff</artifactId>    <version>1.5.6</version> <!-- 请检查最新版本 --></dependency>
使用原生Apache PDFBox:需要手动遍历 PDF 的每一页,将其渲染为 BufferedImage,然后使用 ImageIOUtil 写入 TIFF 文件。

五、一个无需代码的备选方案

如果你不想写代码,只是想快速转换一两个文件,可以考虑使用

命令行工具。例如,pdftocairo(属于 poppler-utils)是一个非常强大的工具,一条命令就能搞定。

将PDF的每一页转换为单独的TIFF文件,分辨率设为300 DPIpdftocairo -tiff -r 300 input.pdf output

这会在当前目录生成output-1.tiff,output-2.tiff等文件。在 Windows 上,你可能需要通过包管理器(如 Chocolatey)来安装 poppler 工具集。

——————————————————————————————

常见问题:

  1. Python出现fitz命令不可用了,可换成pymupdf,如doc=pimupdf.open(pdf_path)。
  2. 按照上述完整代码,发现明明设置了300dpi,但是交付的tiff图片查看属性是发现只有几十dpi。

此类error,问题不在page.get_pixmap(dpi=300),而在于PIL 保存 TIFF 时没有把 300 DPI 写进文件元数据

get_pixmap(dpi=300)只负责按 300 DPI 去渲染,也就是生成足够多的像素。比如 A4 纸在 300 DPI 下会变成约 2480×3508 像素。但 TIFF 文件里还有一个“分辨率标签”,告诉看图软件“这些像素应该按每英寸多少像素来显示”。PIL 的img.save()默认不会自动继承这个信息,所以文件属性里看到的 DPI 是错的。

以下展示修正后的代码:

import pymupdffrom PIL import Imagepdf_path = "D:/fig1.pdf"out_dir = "D:/"doc = pymupdf.open(pdf_path)for page_num in range(len(doc)):    page = doc.load_page(page_num)    pix = page.get_pixmap(dpi=300)    img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)    out_file = f"{out_dir}output_page000_{page_num+1}.tiff"    关键:显式指定 dpi    img.save(out_file, format="TIFF", dpi=(300300), compression="tiff_lzw")    print("保存:", out_file, "像素:", img.size)doc.close()

温馨提示:

如果用adobe illustrator打开PDF导出为TIFF也是个方法,但是常常面临着缺失字体无法嵌入、强制自动更换字体的风险,所以,还是优选上述其他方法哦~

正常Adobe Illustrator导出TIFF/JPG/PDF等格式时,注意养成根据画板/根据内容(根据需要选择,不要不看)、勾选字体嵌入、勾选LZW压缩(针对TIFF文件的无损压缩,大多数期刊明文提倡,少数期刊拒绝,注意要求)的好习惯哦~

相关学习资料