如何使用Pdfium获取PDF文档中带边界信息的文本内容?
获取PDF文本及对应边界信息的Pdfium实现方案
没错,FPDFText_GetText确实只能返回纯文本内容,没法直接拿到文本的位置边界。不过Pdfium其实提供了几个底层API,组合起来就能轻松实现你的需求,我给你分享两种常用的思路:
1. 逐字符精准获取边界
如果需要最精细的字符级边界信息,这个方法最合适:
- 先用
FPDFText_LoadPage加载目标页面的文本上下文 - 调用
FPDFText_CountChars拿到页面的总字符数 - 循环遍历每个字符,通过
FPDFText_GetCharBox获取该字符的左、右、上、下四个边界坐标 - 搭配
FPDFText_GetChar就能拿到对应的字符内容,把两者关联起来就行
给你一段伪代码参考:
FPDF_TEXTPAGE textPage = FPDFText_LoadPage(pdfPage); int totalChars = FPDFText_CountChars(textPage); for (int i = 0; i < totalChars; ++i) { double left, top, right, bottom; // 获取当前字符的边界框 FPDFText_GetCharBox(textPage, i, &left, &top, &right, &bottom); // 获取当前字符 wchar_t character = FPDFText_GetChar(textPage, i); // 这里可以把字符和边界信息存储到你的数据结构里 } // 记得释放资源 FPDFText_ClosePage(textPage);
2. 按行/文本块获取整体边界
如果不需要字符级的精度,只需要行或者某段文本的整体边界,可以用这些API:
FPDFText_GetLineBounds:传入行索引,直接获取整行文本的边界框FPDFText_GetTextBounds:指定文本的起始和结束字符索引,获取这段文本的整体边界
举个按行处理的例子:
FPDF_TEXTPAGE textPage = FPDFText_LoadPage(pdfPage); int totalLines = FPDFText_CountLines(textPage); for (int i = 0; i < totalLines; ++i) { double left, top, right, bottom; FPDFText_GetLineBounds(textPage, i, &left, &top, &right, &bottom); // 获取该行的文本内容 wchar_t lineText[1024]; FPDFText_GetText(textPage, FPDFText_GetLineStart(textPage, i), FPDFText_GetLineEnd(textPage, i), lineText, sizeof(lineText)/sizeof(wchar_t)); // 关联行文本和边界信息 } FPDFText_ClosePage(textPage);
注意事项
- Pdfium的坐标原点在页面左下角,如果你习惯左上角为原点的坐标系,需要用页面高度 - 纵坐标来转换
- 所有文本操作完成后,一定要调用
FPDFText_ClosePage释放资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者Parthi
相关产品推荐
相关产品推荐

