使用iText 7创建符合PDF/UA标准的文本超链接PDF文件遇合规问题的解决方案求助
解决iText 7中PDF/UA合规超链接的问题
你遇到的两个检测报错,本质都是当前代码没有完全满足PDF/UA对链接元素的结构和注释要求,下面我来一步步帮你修正:
报错原因解析
- PAC 3报错:“‘Link’注释未嵌套在‘Link’结构元素内”:直接给
Text设置动作时,iText生成的链接注释(PdfAnnotation)没有关联到对应的Link结构节点,而PDF/UA强制要求所有交互元素必须在结构树中有对应的结构元素包裹。 - Acrobat提示:Link注释的Contents键缺少替代描述:PDF/UA标准要求链接注释必须包含
Contents值作为屏幕阅读器的读取文本,当前代码仅给文本设置了辅助描述,但没有同步到注释本身。
修改后的合规代码
public void testHyperLink() throws IOException { // Create PDF/UA with text hyperlink String filename = "./results/HyperLink.pdf"; WriterProperties properties = new WriterProperties(); properties.addUAXmpMetadata().setPdfVersion(PdfVersion.PDF_1_7); PdfWriter writer = new PdfWriter(filename, properties); PdfDocument pdfDoc = new PdfDocument(writer); // Make document tagged pdfDoc.setTagged(); pdfDoc.getCatalog().setLang(new PdfString("en-US")); pdfDoc.getCatalog().setViewerPreferences(new PdfViewerPreferences().setDisplayDocTitle(true)); PdfDocumentInfo info = pdfDoc.getDocumentInfo(); info.setTitle("Hello Hyperlinks!"); Document document = new Document(pdfDoc); // Must embed font for PDF/UA byte[] inputBytes = Files.readAllBytes(Paths.get("./resources/fonts/opensans-regular.ttf")); boolean embedded = true; boolean cached = false; PdfFont font = PdfFontFactory.createFont(inputBytes, PdfEncodings.CP1252, embedded, cached); // 用Link类替代Text.setAction,自动适配PDF/UA结构要求 String linkText = "This is a Text link"; PdfAction act = PdfAction.createURI("https://itextpdf.com/"); Link link = new Link(linkText, act); link.setFont(font); link.setFontSize(16F); // 设置替代描述,会自动同步到链接注释的Contents属性 link.getAccessibilityProperties().setAlternateDescription("Click here to go to the iText website"); Paragraph para = new Paragraph(); para.add(link); document.add(para); document.close(); System.out.println("Created "+ filename); }
关键修改说明
- 替换为
Link元素:Link是iText专门为超链接设计的组件,它会自动在结构树中生成对应的Link结构节点,并将链接注释正确嵌套其中,直接解决PAC 3的结构报错。 - 统一替代描述设置:给
Link的AccessibilityProperties设置描述后,iText会自动将该值同步到链接注释的Contents属性,满足Acrobat的检测要求。 - 保留基础合规配置:文档标记、语言设置、嵌入字体这些PDF/UA的基础要求都保留了,确保整体合规性。
修改后再用PAC 3和Acrobat预检测试,应该就能通过PDF/UA合规验证了。
内容的提问来源于stack exchange,提问作者tjackson
相关产品推荐
相关产品推荐

