在没有结构树的文档中为PDF图像定义Alt文本

时间:2011-08-25 13:12:18

标签: image pdf html alt

任务是为PDF文档中的图像添加“Alt”文本,以便屏幕阅读器读出文本。

目前,我的PDF文档没有定义结构树。

是否可以将此类文本添加到图像中,而无需为整个文档定义整个结构元素层次结构?我想添加Alt文本,只需对PDF文档进行最少的更改。我用来生成pdf的工具不太适合生成结构元素。因此,我希望完全不需要定义结构。

我正在寻找的是类似HTML的行为,其中Alt文本被本地添加到图像标记,而不需要在其他地方进行更改。

PDF 1.6 spec表示,从PDF 1.5开始,可以添加Alt文本:

  

(PDF 1.5)标记内容序列(参见第10.5节“标记   内容“),通过附加到的属性列表中的Alt条目   带有Span标记的标记内容序列。

可以添加这样的Span而不添加任何结构元素吗?

我的测试显示“不”,但我的测试可能不健全。测试产生了这个:

ET
/Span <</Alt(This is alternate text.)>> BDC
q 180 0 0 15.84 36 747 cm /img0 Do Q
EMC
BT

在PDF 1.4文档中。 doc没有定义结构树:

16 0 obj<</Type/Catalog/Pages 14 0 R>>

然后我破解了第一行,并将PDF版本从1.4更改为1.5。最终结果是Adobe Reader 10无法读取Alt文本。

2 个答案:

答案 0 :(得分:0)

为了拥有一个有效的Alt文本,您需要定义一个结构树,它是PDF规范所要求的。您可以在没有结构树的情况下按照上面的方式定义Alt文本,但它不是标准的,它可能会也可能不起作用。

答案 1 :(得分:0)

虽然我不怀疑iPDFdev一般是正确的,但是以下PDF代码获取NVDA来读取任意文本,替换内容流的任意部分,尽管没有结构树,在打开的PDF 1.4文档中Adobe Reader 9:

/Span <</ActualText (Alt Text Here!) >> BDC
...
EMC

我必须用于同一任务的工具是PDFClown 0.1.1,我不相信它可以生成结构元素,这就是为什么我也尝试使用Span元素。我用来生成工作备用文本的Java代码如下:

PdfDictionary dict = new PdfDictionary();
dict.put(new PdfName("ActualText",false),new PdfString("Alt Text Here!"));
primitiveComposer.begin(new MarkedContent(new BeginMarkedContent(new PdfName("Span"), dict)));

// (do content stream stuff here)

primitiveComposer.end();

对这些程序有更多了解的人必须解释为什么这是有效的,尽管看似不遵循PDF规范,但我希望这仍然有助于任何其他人分配此任务。