PDFMiner返回错误RGB颜色值及LTTextHorizontal问题求助
PDFMiner LTChar 颜色值获取错误的修复方案
问题核心
PDFMiner中graphicstate.ncolor返回的是归一化RGB值(范围0-1),部分PDF因颜色空间定义、渲染状态或代码语法错误,导致非白色颜色值解析异常,同时你提供的代码中存在无效的语法片段,需要先修正。
修复步骤
清理无效代码
移除代码中错误的character.graphicstate[text]([https://stackoverflow.com])部分,该片段属于无效写法,与颜色值获取无关。正确转换颜色值范围
ncolor返回的0-1范围归一化值,若需要常用的0-255区间RGB,需对每个分量做转换:rgb = tuple(int(c * 255) for c in character.graphicstate.ncolor)排查颜色空间与属性混淆
- 检查颜色空间:部分PDF使用CMYK、灰度等非RGB空间,可通过
character.graphicstate.colorspace查看,PDFMiner会自动转换,但特殊空间可能解析异常; - 区分填充色与描边色:
ncolor对应文本填充色,scolor对应描边色,确认你需要的是哪种颜色属性,避免混淆。
- 检查颜色空间:部分PDF使用CMYK、灰度等非RGB空间,可通过
兼容旧版本属性(针对异常PDF)
部分PDFMiner版本中,LTChar可能直接提供fill_color或stroke_color属性,可尝试优先获取:# 获取填充色 fill_color = character.fill_color if hasattr(character, 'fill_color') else character.graphicstate.ncolor rgb_fill = tuple(int(c * 255) for c in fill_color)
修正后的完整代码示例
from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainer, LTChar for page_layout in extract_pages(scr_file): for element in page_layout: if isinstance(element, LTTextContainer): fontinfo = set() for text_line in element: for character in text_line: if isinstance(character, LTChar): fontinfo.add(character.fontname) fontinfo.add(character.size) # 处理填充色并转换为0-255 RGB fill_color = character.graphicstate.ncolor rgb_fill = tuple(int(c * 255) for c in fill_color) fontinfo.add(rgb_fill) # 若需要描边色同理处理 stroke_color = character.graphicstate.scolor rgb_stroke = tuple(int(c * 255) for c in stroke_color) fontinfo.add(rgb_stroke)
额外注意事项
- 若PDF存在透明层或混合模式,需结合
graphicstate.alpha属性调整颜色计算; - 确保使用最新版
pdfminer.six(PDFMiner的维护分支),旧版本可能存在颜色解析BUG,可通过pip install --upgrade pdfminer.six升级。
内容的提问来源于stack exchange,提问作者Shiva Nandan
相关产品推荐
相关产品推荐

