在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
相关产品推荐
相关产品推荐

