4.4.Validation of JPG2000 images with jpylyzer

Since version 1.9.2, Goobi has supported the use of validation plug-ins as part of workflow processing. In order to validate JPG2000 images, intranda has developed a validation plug-in that can be called automatically by Goobi when a user wishes to complete a workflow step that involves inputting JPG2000 images.

Starting the plugin

Although the validation plug-in can be used on the Goobi server, JPG2000 images can also be validated on a separate server. This makes it possible to outsource the validation process when using Goobi with TaskManager. To do so, you need to call the TaskClient using the following parameters:

/usr/bin/java -jar /opt/digiverso/itm/bin/TaskClient.jar 
    -itm http://localhost:8080/itm/service 
    -e -i {stepid} 
    -T {processtitle} 
    -t SHELL 
    -n jp2validate 
    -s {tifpath} 
    -d {imagepath} 
    -gid {processid}

Parameters

The command parameters are explained in the following table:

Parameter

Possible Goobi variable

Meaning

-itm

http://localhost/itm/service

URL to intranda TaskManager interface

-e, --returnError

-

If entered, the TaskClient will end with an error code to prevent the workflow from continuing automatically

-p

0 – 10

Priority to execute this job

-gid

{processid}

Goobi process ID

-i

{stepid}

ID for the workflow step that launches the call

-T, --title

{processtitle}

Goobi process title for which the call is launched

-t, --jobtype

SHELL

Job type

-n, --templatename

jp2validate

Name of previously generated configuration file

-s, --source

{tifpath}

Path to the media directory for the process

-d, --destination

{imagepath}

Path to image root directory for the process

Operation of the plugin

After validation, jpylyzer will generate a detailed results file for each validated image. The file will list any problems that may have occurred during validation.

<jpylyzer xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ns0="adobe:ns:meta/" xmlns:ns3="http://ns.adobe.com/exif/1.0/" xmlns:ns4="http://ns.adobe.com/photoshop/1.0/" xmlns:ns5="http://ns.adobe.com/tiff/1.0/" xmlns:ns6="http://ns.adobe.com/xap/1.0/" xmlns:ns7="http://ns.adobe.com/xap/1.0/mm/" xmlns:ns8="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <toolInfo>
    <toolName>jpylyzer.py</toolName>
    <toolVersion>1.6.0</toolVersion>
  </toolInfo>
  <fileInfo>
    <fileName>balloon_trunc1.jp2</fileName>
    <filePath>/opt/digiverso/goobi/metadata/2282/images/1331281544521_b18022029_tif/balloon_trunc1.jp2</filePath>
    <fileSizeInBytes>670264</fileSizeInBytes>
    <fileLastModified>Tue Jul 24 03:54:44 2012</fileLastModified>
  </fileInfo>
  <isValidJP2>False</isValidJP2>
  <tests>
    <contiguousCodestreamBox>
      <tileParts>
        <tilePart>
          <foundNextTilePartOrEOC>False</foundNextTilePartOrEOC>
        </tilePart>
      </tileParts>
      <foundEOCMarker>False</foundEOCMarker>
    </contiguousCodestreamBox>
  </tests>
  <properties>
    <signatureBox />
    <fileTypeBox>
      <br>jp2</br>
      <minV>0</minV>
      <cL>jp2</cL>
    </fileTypeBox>
    <jp2HeaderBox>
      <imageHeaderBox>
        <height>3701</height>
        <width>2717</width>
        <nC>3</nC>
        <bPCSign>unsigned</bPCSign>
        <bPCDepth>8</bPCDepth>
        <c>jpeg2000</c>
        <unkC>yes</unkC>
        <iPR>no</iPR>
      </imageHeaderBox>
      <colourSpecificationBox>
        <meth>Enumerated</meth>
        <prec>0</prec>
        <approx>0</approx>
        <enumCS>sRGB</enumCS>
      </colourSpecificationBox>
    </jp2HeaderBox>
    <uuidInfoBox>
      <uuidListBox>
        <nU>2</nU>
        <uuid>6a706a70-6a70-6a70-6a70-6a706a706a70</uuid>
        <uuid>61626162-6162-6162-6162-616261626162</uuid>
      </uuidListBox>
      <urlBox>
        <version>0</version>
        <loc>http://www.openplanetsfoundation.org/</loc>
      </urlBox>
    </uuidInfoBox>
    <xmlBox>
      <ns0:xmpmeta ns0:xmptk="Image::ExifTool 8.29">
        <rdf:RDF>
          <rdf:Description rdf:about="">
            <dc:format>image/jpeg</dc:format>
          </rdf:Description>
          <rdf:Description rdf:about="">
            <ns3:ColorSpace>65535</ns3:ColorSpace>
            <ns3:NativeDigest>256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;7EF15F60B74B2599BAEDB6749C30991A</ns3:NativeDigest>
            <ns3:PixelXDimension>2717</ns3:PixelXDimension>
            <ns3:PixelYDimension>3701</ns3:PixelYDimension>
          </rdf:Description>
          <rdf:Description rdf:about="">
            <ns4:ColorMode>3</ns4:ColorMode>
            <ns4:History />
          </rdf:Description>
          <rdf:Description rdf:about="">
            <ns5:BitsPerSample>
              <rdf:Seq>
                <rdf:li>8</rdf:li>
              </rdf:Seq>
            </ns5:BitsPerSample>
            <ns5:Compression>1</ns5:Compression>
            <ns5:ImageLength>3701</ns5:ImageLength>
            <ns5:ImageWidth>2717</ns5:ImageWidth>
            <ns5:NativeDigest>256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;7EF15F60B74B2599BAEDB6749C30991A</ns5:NativeDigest>
            <ns5:Orientation>1</ns5:Orientation>
            <ns5:PhotometricInterpretation>2</ns5:PhotometricInterpretation>
            <ns5:PlanarConfiguration>1</ns5:PlanarConfiguration>
            <ns5:ResolutionUnit>2</ns5:ResolutionUnit>
            <ns5:SamplesPerPixel>4</ns5:SamplesPerPixel>
            <ns5:Software>Adobe Photoshop CS3 Windows</ns5:Software>
            <ns5:XResolution>72/1</ns5:XResolution>
            <ns5:YCbCrSubSampling>1 1</ns5:YCbCrSubSampling>
            <ns5:YResolution>72/1</ns5:YResolution>
          </rdf:Description>
          <rdf:Description rdf:about="">
            <ns6:CreateDate>2008-07-19T16:14:14-07:00</ns6:CreateDate>
            <ns6:CreatorTool>Adobe Photoshop CS3 Windows</ns6:CreatorTool>
            <ns6:MetadataDate>2008-07-19T16:14:14-07:00</ns6:MetadataDate>
            <ns6:ModifyDate>2008-07-19T16:14:14</ns6:ModifyDate>
          </rdf:Description>
          <rdf:Description rdf:about="">
            <ns7:DerivedFrom rdf:parseType="Resource">
              <ns8:instanceID>uuid:AC48AD726754DD11BA6DEACED58C77FA</ns8:instanceID>
            </ns7:DerivedFrom>
            <ns7:DocumentID>uuid:6200E56DE155DD118C3CED023B237FE5</ns7:DocumentID>
            <ns7:InstanceID>uuid:6300E56DE155DD118C3CED023B237FE5</ns7:InstanceID>
          </rdf:Description>
        </rdf:RDF>
      </ns0:xmpmeta>
    </xmlBox>
    <contiguousCodestreamBox>
      <siz>
        <lsiz>47</lsiz>
        <rsiz>ISO/IEC 15444-1</rsiz>
        <xsiz>2717</xsiz>
        <ysiz>3701</ysiz>
        <xOsiz>0</xOsiz>
        <yOsiz>0</yOsiz>
        <xTsiz>1024</xTsiz>
        <yTsiz>1024</yTsiz>
        <xTOsiz>0</xTOsiz>
        <yTOsiz>0</yTOsiz>
        <numberOfTiles>12</numberOfTiles>
        <csiz>3</csiz>
        <ssizSign>unsigned</ssizSign>
        <ssizDepth>8</ssizDepth>
        <xRsiz>1</xRsiz>
        <yRsiz>1</yRsiz>
        <ssizSign>unsigned</ssizSign>
        <ssizDepth>8</ssizDepth>
        <xRsiz>1</xRsiz>
        <yRsiz>1</yRsiz>
        <ssizSign>unsigned</ssizSign>
        <ssizDepth>8</ssizDepth>
        <xRsiz>1</xRsiz>
        <yRsiz>1</yRsiz>
      </siz>
      <cod>
        <lcod>18</lcod>
        <precincts>yes</precincts>
        <sop>yes</sop>
        <eph>yes</eph>
        <order>RPCL</order>
        <layers>6</layers>
        <multipleComponentTransformation>yes</multipleComponentTransformation>
        <levels>5</levels>
        <codeBlockWidth>64</codeBlockWidth>
        <codeBlockHeight>64</codeBlockHeight>
        <codingBypass>no</codingBypass>
        <resetOnBoundaries>no</resetOnBoundaries>
        <termOnEachPass>no</termOnEachPass>
        <vertCausalContext>no</vertCausalContext>
        <predTermination>no</predTermination>
        <segmentationSymbols>yes</segmentationSymbols>
        <transformation>9-7 irreversible</transformation>
        <precinctSizeX>128</precinctSizeX>
        <precinctSizeY>128</precinctSizeY>
        <precinctSizeX>128</precinctSizeX>
        <precinctSizeY>128</precinctSizeY>
        <precinctSizeX>128</precinctSizeX>
        <precinctSizeY>128</precinctSizeY>
        <precinctSizeX>128</precinctSizeX>
        <precinctSizeY>128</precinctSizeY>
        <precinctSizeX>256</precinctSizeX>
        <precinctSizeY>256</precinctSizeY>
        <precinctSizeX>256</precinctSizeX>
        <precinctSizeY>256</precinctSizeY>
      </cod>
      <qcd>
        <lqcd>35</lqcd>
        <qStyle>scalar expounded</qStyle>
        <guardBits>2</guardBits>
        <mu>1816</mu>
        <epsilon>13</epsilon>
        <mu>1770</mu>
        <epsilon>13</epsilon>
        <mu>1770</mu>
        <epsilon>13</epsilon>
        <mu>1724</mu>
        <epsilon>13</epsilon>
        <mu>1792</mu>
        <epsilon>12</epsilon>
      </qcd>
      <com>
        <lcom>17</lcom>
        <rcom>ISO/IEC 8859-15 (Latin)</rcom>
        <comment>Jpylyzer demo</comment>
      </com>
      <tileParts>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>0</isot>
            <psot>67161</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>1</isot>
            <psot>99064</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>2</isot>
            <psot>36130</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>3</isot>
            <psot>56048</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>4</isot>
            <psot>140022</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>5</isot>
            <psot>24008</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>6</isot>
            <psot>46691</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>7</isot>
            <psot>62671</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>8</isot>
            <psot>26306</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>9</isot>
            <psot>45614</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>10</isot>
            <psot>38428</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
        <tilePart>
          <sot>
            <lsot>10</lsot>
            <isot>11</isot>
            <psot>25064</psot>
            <tpsot>0</tpsot>
            <tnsot>1</tnsot>
          </sot>
        </tilePart>
      </tileParts>
    </contiguousCodestreamBox>
    <compressionRatio>45.01</compressionRatio>
  </properties>
</jpylyzer>

Once validation is complete, TaskManager will analyse the corresponding results files and automatically update the Goobi process log to include information about the validation.

When all the images for a given process have been successfully validated, TaskManager will close the corresponding workflow step in Goobi by calling the WebApi.

Whatever the outcome of validation, the results files for each jpylyzer run will be stored in the Goobi process folder within the validation folder. The path for storing jpylyzer results files might be as follows:

/opt/digiverso/goobi/metadata/2282/validation/2012-20-05_11-20-01_jpylyzer/

Last updated