You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中用Tesseract处理PDF OCR时写入TIFF报错求助

解决Tesseract处理扫描PDF时的INTEGER()类型错误

我来帮你搞定这个报错!你遇到的Error in tiff::writeTIFF(bitmap, "page.tiff") : INTEGER() can only be applied to a 'integer', not a 'raw'问题,核心原因是**pdf_render_page返回的是raw格式的字节流数据**,但tiff::writeTIFF要求输入必须是整数矩阵类型,两者不兼容导致的。

下面给你两种可行的解决办法:

方法1:用pdf_convert直接转换PDF到图像(推荐)

pdftools包自带的pdf_convert函数可以一步完成PDF到图像的转换,完全避开手动处理位图数据的麻烦,代码更简洁:

library(pdftools)
library(tesseract)

setwd(tempdir())
news <- file.path(Sys.getenv("R_DOC_DIR"), "NEWS.pdf")

# 直接将PDF第1页转换为TIFF文件(默认输出文件名是原文件名_页码.tiff)
pdf_convert(news, format = "tiff", dpi = 300, pages = 1)

# 提取图像中的文本
out <- ocr("NEWS_1.tiff")
cat(out)

这个方法会自动处理图像格式转换,生成的TIFF文件可以直接被tesseract::ocr识别,不需要额外的格式转换步骤。

方法2:手动将raw数据转换为整数矩阵

如果你一定要用pdf_render_page获取位图数据,可以手动把raw字节流转换成writeTIFF能识别的整数矩阵:

library(pdftools)
library(tiff)
library(tesseract)

setwd(tempdir())
news <- file.path(Sys.getenv("R_DOC_DIR"), "NEWS.pdf")

# 获取raw格式的位图数据
bitmap_raw <- pdf_render_page(news, dpi = 300)

# 从raw数据的属性中提取图像的宽高信息
img_dim <- attr(bitmap_raw, "dim")
# 将raw数据转换为整数矩阵(RGBA格式,每个像素对应4个字节)
bitmap_matrix <- matrix(as.integer(bitmap_raw), nrow = img_dim[1], ncol = img_dim[2], byrow = TRUE)

# 写入TIFF文件,指定每个颜色通道为8位
tiff::writeTIFF(bitmap_matrix, "page.tiff", bits = 8)

# 提取文本
out <- ocr("page.tiff")
cat(out)

这里的关键是把raw向量转换成整数矩阵,同时利用pdf_render_page返回数据的dim属性获取图像尺寸,确保矩阵的行列数正确匹配图像的像素分布。


内容的提问来源于stack exchange,提问作者Lod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:28:32