1

使用 iTextSharp 从 PDF 中提取颜色时出现此错误:

int r = renderInfo.GetColorNonStroke().R;
int g = renderInfo.GetColorNonStroke().G;
int b = renderInfo.GetColorNonStroke().B;

错误信息 :

你调用的对象是空的。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详情:

System.NullReferenceException:对象引用未设置为对象的实例。

4

1 回答 1

2

由于GetColorNonStroke不是原始 iTextSharp 的方法,TextRenderInfo,我假设您使用的是根据 @ChrisHaas 的博客条目从 iTextSharp 的 TextRenderInfo 和 ITextExtractionStrategy 获取颜色信息修补的版本。

成员colorStrokecolorNonStrokeGraphicsState它们的值分别由TextRenderInfo方法GetColorStroke和返回GetColorNonStroke)被初始化为null.

因此,只要之前没有明确的命令设置描边或非描边颜色,相应的TextRenderInfo方法GetColorStrokeGetColorNonStroke将返回null.

因此,无论何时使用,在访问其成员之前renderInfo.GetColorNonStroke(),检查它。null如果颜色是null,默认的。

此外,@ChrisHaas 的 iTextSharp 解析功能的颜色扩展使用不同类型的颜色对象:GrayColor, BaseColor,并且CMYKColor.根据您的要求,您可能想要测试返回给您的颜色类型。

如果是特殊颜色,Chris Haas 甚至写道

SCNscn本身就是非 RGB、CMYK 或灰色的其他一切的统称。在点击这两个中的一个之前,您实际上应该首先找到一个CS运算符,其第一个也是唯一的操作数是要使用的实际颜色空间。有很多选项,包括 DeviceRGB、DeviceCMYK、Pattern、Lab、DeviceN 等。您可以在 2008 PDF 规范第 8.6.8 节(第 171 页)的表 74 中找到这些选项。我的代码实际上并不完全正确,我不应该将CScs推送到SetStrokingGeneral方法,而是应该做一些进一步的处理。不幸的是,我当时拥有的所有示例 PDF 都没有此设置,因此我无法对其进行测试。希望这可以帮助你!

于 2013-06-26T07:04:49.493 回答