如何将Google Cloud Vision生成的OCR JSON嵌入PDF使其可检索?
关于hOCR嵌入PDF实现可检索的解决方案
核心结论
hOCR文件本身不能直接嵌入PDF,但可以基于hOCR里的文本和位置信息,为PDF生成隐藏文本层,让原本的扫描件PDF变成可检索的文本PDF。
具体实现路径
1. 直接用原始OCR JSON(更高效)
既然你已经有包含位置、文本的JSON输出,没必要绕hOCR,可以直接解析JSON提取关键信息:
- 提取每个文本片段的内容、对应的页面坐标(注意:hOCR/Google Vision的坐标原点在左上角,而PDF的坐标原点在左下角,需要做y轴坐标转换:PDF页面高度 - hOCR的y坐标)。
- 使用PHP的PDF处理库(如
TCPDF、FPDF)加载原PDF,在对应坐标位置添加不可见文本:- 示例代码逻辑(以TCPDF为例):
// 初始化TCPDF并导入原PDF页面 $pdf = new TCPDF(); $pageCount = $pdf->setSourceFile('original.pdf'); $tplIdx = $pdf->importPage(1); $pdf->AddPage(); $pdf->useTemplate($tplIdx); // 解析OCR JSON $ocrData = json_decode(file_get_contents('output-1-to-2.json'), true); $pageHeight = $pdf->getPageHeight(); // 获取PDF页面高度 // 遍历文本块添加隐藏文本 foreach ($ocrData['responses'][0]['textAnnotations'] as $anno) { if (isset($anno['description']) && isset($anno['boundingPoly']['vertices'])) { $text = $anno['description']; // 获取文本块左上角坐标 $x = $anno['boundingPoly']['vertices'][0]['x']; $y = $pageHeight - $anno['boundingPoly']['vertices'][0]['y']; // 设置文本颜色为白色(和背景一致,实现隐藏) $pdf->SetTextColor(255, 255, 255); // 设置字体大小匹配文本块高度 $pdf->SetFont('helvetica', '', 10); // 在对应位置输出文本 $pdf->Text($x, $y, $text); } } // 保存带文本层的PDF $pdf->Output('searchable.pdf', 'F');
- 示例代码逻辑(以TCPDF为例):
2. 基于hOCR文件转换
如果想用已生成的hOCR,可以借助命令行工具hocr2pdf,PHP通过调用系统命令完成转换:
- 确保服务器安装了
hocr2pdf(属于ocrmypdf工具链的一部分) - PHP执行命令的示例:
$originalPdf = 'original.pdf'; $hocrFile = 'output.hocr'; $outputPdf = 'searchable.pdf'; // 调用hocr2pdf生成可检索PDF exec("hocr2pdf -i $originalPdf -o $outputPdf < $hocrFile");
注意事项
- 坐标转换必须准确,否则文本检索会出现位置偏移。
- 对于多页PDF,需要循环处理每一页的OCR数据或hOCR内容。
- 如果使用命令行工具,要确保PHP进程有执行权限,且工具路径正确。
内容的提问来源于stack exchange,提问作者sariDon
相关产品推荐
相关产品推荐

