Ibex 6.9 supports the PDF Universal Accessibility Standard

For information on the standard see PDF/UA

Downloading the Beta

The beta version of Ibex 6.9 can be installed using the normal process described here. The only additional step required is to enable prelease versions to be shown. In Visual Studio 2022 this is done by ticking the "Include prerelease" checkbox as shown here:

Enabled PDF/UA Creation

To create a PDF/UA compliant PDF the FO file needs to have three things:

(1) a declaration of the ibex namespace on the <fo:root> element like this:

<fo:root 
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:ibex="http://www.xmlpdf.com/2003/ibex/Format"
    ...
    >

(2) a language declaration, which can be done on the <fo:root> element like this:

<fo:root 
  xml:lang="en-US"
  ...
  >

(3) the FO file needs to include metadata surrounded by ibex:pdfua tags like this:

<ibex:pdfua>
    <x:xmpmeta xmlns:x="adobe:ns:meta/"
        x:xmptk="Adobe XMP Core 5.6-c01591.163280, 2018/06/22-11:31:03">
        <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
        <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:pdfuaid="http://www.aiim.org/pdfua/ns/id/">
            <dc:title>
            <rdf:Alt>
                <rdf:li xml:lang="en">PDF/UA Document</rdf:li>
            </rdf:Alt>
            </dc:title>
            <pdfuaid:part>1</pdfuaid:part>
        </rdf:Description>
        </rdf:RDF>
    </x:xmpmeta>
</ibex:pdfua>

This metadata includes the title "PDF/UA Document", change that to your own document title.

Once the three items above are included in the FO file Ibex will produce a PDF/UA compliant file.

A complete test file with one paragraph looks like this:

<?xml version="1.0" encoding="utf-8"?>
<fo:root 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" 
  xmlns:ibex="http://www.xmlpdf.com/2003/ibex/Format" 
  xml:lang="en-US"
  >

  <ibex:pdfua>
    <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c01591.163280, 2018/06/22-11:31:03">
      <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
        <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pdfuaid="http://www.aiim.org/pdfua/ns/id/">
          <dc:title>
            <rdf:Alt>
              <rdf:li xml:lang="x-default">PDF/UA Document</rdf:li>
              <rdf:li xml:lang="en">PDF/UA Document</rdf:li>
            </rdf:Alt>
          </dc:title>
          <pdfuaid:part>1</pdfuaid:part>
        </rdf:Description>
      </rdf:RDF>
    </x:xmpmeta>
  </ibex:pdfua>

  <fo:layout-master-set>
    <fo:simple-page-master master-name="page" margin="1.5cm" page-height="297mm" page-width="310mm">
      <fo:region-body column-count="1" region-name="body" margin="2.75cm 0.5cm 1cm 3cm" />
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:bookmark-tree>
    <fo:bookmark internal-destination="header1" starting-state="show">
      <fo:bookmark-title>Heading One</fo:bookmark-title>
    </fo:bookmark>
  </fo:bookmark-tree>

  <fo:page-sequence master-reference="page" initial-page-number="1" format="i" font="12pt arial">
    <fo:flow font="11pt arial" flow-name="body">
      <fo:block font-size="larger" role="H1" id="header1">
         Main heading
      </fo:block>
      <fo:block>
        Hello world
      </fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

The file created from the FO can be validated using the free PAC program. This tests various aspects of compliance and shows the results:

The tagged pdf tree structure can be viewed:

Note that the contents of the fo:page-sequence have been placed in a "Part" structure element. This is optional, controlled by the Settings.PDFUA_PutPageSequenceAreasInPartElements flag.

Headers

As shown in the above example any fo:block can have the "role" property set. To create a header use H1, H2 .. H6 as standards-compliant heading roles, like this:

<fo:block font-size="larger" role="H1" id="header1">
    Main heading
</fo:block>

To disable the use of the "role" property when creating structured elements specify the 'ignore-role-attributes' property on the ibex:pdfua node like this:

<ibex:pdfua ignore-role-attributes="true">

Tables

Table elements are automatically tagged according to the following table:

Element Tag
fo:table Table
fo:table-caption Caption
fo:table-header THead
fo:table-body TBody
fo:table-footer TFoot
fo:table-row TR
fo:table-cell TD or TH

Table cells inside a table header as tagged as TH. In addition:

  • cells in table headers are given an "ID" property to identify them
  • cells in the table body automatically have a "Headers" property which identifies which header cell(s) are relevant headings. There might be multiple if the cell spans multiple columns
  • where are header has multiple rows, the cells in the lower rows have "Headers" properties which reference the cells in higher rows which cover the same columns

In practice this looks like the element tree shown below, where are TH element has "ID", "Role" and "Rowspan" properties:

And a TD cell element in the table body has a "Headers" property which matches the "id" property of the cell above it in the header:

Lists

List elements are automatically tagged according to the following table:

Element Tag
fo:list-block L
fo:list-item LI
fo:list-item-label Lbl
fo:list-item-body Lbody

Static Content

The contents of fo:static-content elements is marked as "Artifact".

Image Alt Tags

You can specify an Alt tag to describe images with text using the "ibex:alt" property like this:

<fo:external-graphic src="RedbrushAlpha-0.25.png" ibex:alt="picture of tree"/>

Feedback

Please send any feedback to support@xmlpdf.com.