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.