PDFlib TET读取文本颜色时tet.colorspaceid恒为0问题咨询
PDFlib TET读取文本颜色的正确方案
问题原因
你遇到的tet.colorspaceid始终为0的问题,核心有两个原因:
- 默认配置下TET不会提取文本的图形属性(包括颜色、颜色空间ID等)
- 直接读取全局TET对象的
colorspaceid属性是错误的,该属性不对应当前匹配的文本片段的属性值
解决步骤
1. 开启页面图形属性提取
调用tet.open_page()时,添加includegraphics={graphicsdetails=text}选项,启用文本图形属性解析能力:
// pageno为待处理的页码,从1开始计数 int page = tet.open_page(doc, pageno, "includegraphics={graphicsdetails=text}"); if (page == -1) { System.err.println("打开页面失败:" + tet.get_errmsg()); return; }
2. 从匹配文本对应的字符信息中获取颜色空间ID
tet.search()返回的匹配结果包含matchpos(匹配片段第一个字符的索引)和matchlen(匹配字符总数)两个属性,你需要遍历该范围内的字符,通过get_char_info()方法拿到对应字符的颜色空间ID:
// 假设已获取匹配结果的matchpos、matchlen for (int i = 0; i < matchlen; i++) { TET.CharInfo charInfo = tet.get_char_info(page, matchpos + i); if (charInfo == null) break; // 拿到当前字符对应的颜色空间ID int currentCsId = charInfo.colorspaceid; String csname = tet.pcos_get_string(doc, "colorspaces[" + currentCsId + "]/name"); if ("Separation".equals(csname)) { String type = tet.pcos_get_string(doc, "type:colorspaces[" + currentCsId + "]/colorantname"); if ("name".equalsIgnoreCase(type)) { String colorantName = tet.pcos_get_string(doc, "colorspaces[" + currentCsId + "]/colorantname"); System.out.println("专色名称:" + colorantName); } } // 同一匹配片段颜色一致的话,取第一个字符的属性后即可break跳出循环 }
额外说明
- 若需要获取具体颜色值,可读取
CharInfo对象的color数组,数组长度与对应颜色空间的分量数一致 - 页面处理完成后需要调用
tet.close_page(page)释放资源
内容的提问来源于stack exchange,提问作者sdo
相关产品推荐
相关产品推荐

