Example: Creating a simple PDF plug-in

This scenario walks through the process of creating a very simple plug-in (com.example.print-pdf) that creates a new transformation type: print-pdf.

About this task

The print-pdf transformation has the following characteristics:

  • Uses A4 paper
  • Renders figures with a title at the top and a description at the bottom
  • Removes the period after the number for an ordered-list item
  • Use em dashes as the symbols for unordered lists

Procedure

  1. In the plugins directory, create a directory named com.example.print-pdf.
  2. In the new com.example.print-pdf directory, create a plug-in configuration file (plugin.xml) that declares the new print-pdf transformation and its dependencies.
    Figure 1. plugin.xml file
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-model href="https://www.dita-ot.org/rng/plugin.rnc" type="application/relax-ng-compact-syntax"?>
    
    <plugin id="com.example.print-pdf">
      <require plugin="org.dita.pdf2"/>
      <transtype name="print-pdf" extends="pdf" desc="PDF on A4 paper"/>
      <feature extension="dita.transtype.print" value="print-pdf"/>
      <feature extension="ant.import" file="integrator.xml"/>
    </plugin>
  3. Add an Ant script (integrator.xml) to define the transformation type.
    Figure 2. integrator.xml file
    <?xml version='1.0' encoding='UTF-8'?>
    <project>
      <target name="dita2print-pdf"
           depends="dita2print-pdf.init,
                    dita2pdf2"/>
      <target name="dita2print-pdf.init">
        <property name="customization.dir"
              location="${dita.plugin.com.example.print-pdf.dir}/cfg"/>
       </target>
    </project>
  4. In the new plug-in directory, add a cfg/catalog.xml file that specifies the custom XSLT style sheets.
    Figure 3. cfg/catalog.xml file
    <?xml version="1.0" encoding="UTF-8"?>
    <catalog prefer="system"
             xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
      <uri name="cfg:fo/attrs/custom.xsl" uri="fo/attrs/custom.xsl"/>
      <uri name="cfg:fo/xsl/custom.xsl" uri="fo/xsl/custom.xsl"/>
    </catalog>
  5. Create the cfg/fo/attrs/custom.xsl file, and add attribute and variable overrides to it.
    For example, add the following variables to change the page size to A4.
    Figure 4. cfg/fo/attrs/custom.xsl file
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    version="2.0">
      <!-- Change page size to A4 -->
      <xsl:variable name="page-width">210mm</xsl:variable>
      <xsl:variable name="page-height">297mm</xsl:variable>
    </xsl:stylesheet>
  6. Create the cfg/fo/xsl/custom.xsl file, and add XSLT overrides to it.
    For example, the following code changes the rendering of <figure> elements.
    Figure 5. cfg/fo/xsl/custom.xsl file
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    xmlns:fo="http://www.w3.org/1999/XSL/Format"
                    version="2.0">
      <!-- Move figure title to top and description to bottom -->
      <xsl:template match="*[contains(@class,' topic/fig ')]">
        <fo:block xsl:use-attribute-sets="fig">
          <xsl:call-template name="commonattributes"/>
          <xsl:if test="not(@id)">
            <xsl:attribute name="id">
              <xsl:call-template name="get-id"/>
            </xsl:attribute>
          </xsl:if>
          <xsl:apply-templates select="*[contains(@class,' topic/title ')]"/>
          <xsl:apply-templates select="*[not(contains(@class,' topic/title ') or contains(@class,' topic/desc '))]"/>
          <xsl:apply-templates select="*[contains(@class,' topic/desc ')]"/>
        </fo:block>
      </xsl:template>
    </xsl:stylesheet>
  7. Create an English-language variable-definition file (cfg/common/vars/en.xml) and make any necessary modifications to it.
    For example, the following code removes the period after the number for an ordered-list item; it also specifies that the bullet for an unordered list item should be an em dash.
    Figure 6. cfg/common/vars/en.xml file
    <?xml version="1.0" encoding="UTF-8"?>
    <variables>
      <!-- Remove dot from list number -->
      <variable id="Ordered List Number 1">
        <param ref-name="number"/>
      </variable>
      <!-- Change unordered list bullet to an em dash -->
      <variable id="Unordered List bullet 1">&#x2014;</variable>
    </variables>

Results

Tip:
The files for this sample plug-in are included in the DITA-OT installation directory under docsrc/samples/plugins/com.example.print-pdf/ and on GitHub.

The plug-in directory has the following layout and files:

com.example.print-pdf
โ”œโ”€โ”€ cfg
โ”‚   โ”œโ”€โ”€ catalog.xml
โ”‚   โ”œโ”€โ”€ common
โ”‚   โ”‚   โ””โ”€โ”€ vars
โ”‚   โ”‚       โ””โ”€โ”€ en.xml
โ”‚   โ””โ”€โ”€ fo
โ”‚       โ”œโ”€โ”€ attrs
โ”‚       โ”‚   โ””โ”€โ”€ custom.xsl
โ”‚       โ””โ”€โ”€ xsl
โ”‚           โ””โ”€โ”€ custom.xsl
โ”œโ”€โ”€ integrator.xml
โ””โ”€โ”€ plugin.xml

What to do next

  1. Use the dita install subcommand to install the plug-in.

    Note:
    For more information, see Installing plug-ins.
  2. Build output with the new transformation type to verify that the plug-in works as intended.
    dita --input=my.ditamap --format=print-pdf