是否可以使用 PDFBox 创建带标签的 PDF(PDF/UA)?看起来 PDFBox 有一个 API(包
org.apache.pdfbox.pdmodel.documentinterchange.taggedpdf
),但我找不到任何教程或代码示例。
使用下面的代码,我生成了一个包含图像的 PDF 文件,屏幕阅读器 NVDA(在我的例子中)可以识别它并读取“...图形替代描述”。但是,可访问性检查器PAC 2显示错误:“图像对象未标记”。
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);
PDDocumentCatalog documentCatalog = doc.getDocumentCatalog();
PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, doc);
PDPageContentStream contents = new PDPageContentStream(doc, page);
contents.drawImage(pdImage, 100, 600, pdImage.getWidth() / 2, pdImage.getHeight() / 2);
contents.close();
PDStructureTreeRoot treeRoot = new PDStructureTreeRoot();
PDStructureElement structureElement = new PDStructureElement(StandardStructureTypes.Figure, treeRoot);
structureElement.setPage(page);
PDMarkedContent markedImg = new PDMarkedContent(COSName.IMAGE, new COSDictionary());
markedImg.addXObject(pdImage);
structureElement.appendKid(markedImg);
structureElement.setAlternateDescription("Alternate Description");
treeRoot.appendKid(structureElement);
documentCatalog.setStructureTreeRoot(treeRoot);
// ....
doc.save(fileName);
您能提供一些关于这个主题的解释或/和代码示例吗?
我提供了一个工作示例,演示如何使用 PDFBox 2 创建可访问的 PDF: https://github.com/martinlovell/accessible-pdfbox-example
问题中的代码缺少一些内容。标记的内容需要替代文本,我相信您需要该标记内容的 mcid。
示例项目更详细地演示了您的需求。
它会是这样的:
PDPageContentStream contents = new PDPageContentStream(doc, page);
// the content in the stream needs an id
int mcid = 5;
COSDictionary dictionary = new COSDictionary();
dictionary = new COSDictionary();
dictionary(COSName.MCID, mcid);
// wrap image drawing in marked content
contents.beginMarkedContent(COSName.IMAGE, PDPropertyList.create(dictionary));
contents.drawImage(pdImage, 100, 600, pdImage.getWidth() / 2, pdImage.getHeight() / 2);
contents.endMarkedContent();
contents.close();
PDStructureTreeRoot treeRoot = new PDStructureTreeRoot();
documentCatalog.setStructureTreeRoot(treeRoot);
PDStructureElement structureElement = new PDStructureElement(StandardStructureTypes.Figure, treeRoot);
structureElement.setPage(page);
structureElement.setAlternateDescription("Alternate Description");
// Set alt text on marked content for structure.
// This is the dictionary with the mcid used in beginMarkedContent.
dictionary.setString(COSName.ALT, "Alternate Description");
PDMarkedContent markedImg = new PDMarkedContent(COSName.IMAGE, dictionary);
markedImg.addXObject(pdImage);
structureElement.appendKid(markedImg);
有人找到了使用 pdfbox (当前版本 3.0.0)标记内容的方法吗? mlowell 提供的示例仅适用于正确构建元素,但 PAC 工具仍然会对未标记的内容发出警告。