uk.org.openeyes.DICOMHFAVF.java Source code

Java tutorial

Introduction

Here is the source code for uk.org.openeyes.DICOMHFAVF.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package uk.org.openeyes;

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.pdfbox.cos.COSDocument;
import org.apache.pdfbox.io.RandomAccessBuffer;
import org.apache.pdfbox.io.RandomAccessRead;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.Sequence;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import static uk.org.openeyes.DICOMParser.hexStringToByteArray;

/**
 *
 * @author veta
 */

public class DICOMHFAVF {

    private DICOMParser parser;

    /**
     *
     * @param mainParser
     */
    public DICOMHFAVF(DICOMParser mainParser) {
        this.parser = mainParser;
    }

    /**
     *
     * @param Attrs
     * @throws IOException
     */
    public void collectData(Attributes Attrs) throws IOException {

        if (Attrs.contains(parser.getTagInteger("00420011"))) {
            byte[] pdfbytes = Attrs.getBytes(parser.getTagInteger("00420011"));

            FileOutputStream pdffos = new FileOutputStream("d:\\work\\wombex\\WombexUK\\AcrossHealth\\"
                    + Attrs.getString(parser.getTagInteger("00420010")) + ".pdf");
            pdffos.write(pdfbytes);
            pdffos.close();

            PDFParser parser = null;
            PDDocument pdDoc = null;
            COSDocument cosDoc = null;
            PDFTextStripper pdfStripper;
            String parsedText = "";

            RandomAccessRead pdfData = new RandomAccessBuffer(pdfbytes);
            try {
                parser = new PDFParser(pdfData);
                parser.parse();
                cosDoc = parser.getDocument();
                pdfStripper = new PDFTextStripper();
                pdDoc = new PDDocument(cosDoc);
                parsedText = pdfStripper.getText(pdDoc);
                System.out.println(parsedText);
                debugMessage(parsedText);
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    if (cosDoc != null)
                        cosDoc.close();
                    if (pdDoc != null)
                        pdDoc.close();
                } catch (Exception e1) {
                    e.printStackTrace();
                }

            }

        }

        // this is just a test function for HFA files
        // 2 main groups: 7717 and 0301 can be extracted
        if (Attrs.contains(parser.getTagInteger("03010010"))) {
            debugMessage("Extracting 0301 group...");
            debugMessage("Test Type: " + Attrs.getString(parser.getTagInteger("03011000")));
            debugMessage("Test strategy: " + Attrs.getString(parser.getTagInteger("03011001")));
            debugMessage("Test Pattern: " + Attrs.getString(parser.getTagInteger("03011002")));
            debugMessage("Screening Mode: " + Attrs.getString(parser.getTagInteger("03011003")));

            debugMessage("Stimulus Color: " + Attrs.getString(parser.getTagInteger("03011004")));
            debugMessage("Stimulus Size: " + Attrs.getString(parser.getTagInteger("03011005")));
            debugMessage("Blue Yellow: " + Attrs.getString(parser.getTagInteger("03011006")));
            debugMessage("PDB Version: " + Attrs.getString(parser.getTagInteger("03011007")));

            debugMessage("HFA Raw Data: ");
            byte[] rawbytes;

            try {
                rawbytes = Attrs.getBytes(parser.getTagInteger("03011008"));
                // TODO: move this part into a function, and this is a hack now!!!
                byte[] correctedBytes = new byte[rawbytes.length - 2];
                int j = 0;
                for (int i = 0; i < rawbytes.length - 1; i++) {
                    if (!String.format("%02X", rawbytes[i]).equals("04")) {
                        correctedBytes[j] = rawbytes[i];
                        j++;
                    }
                }

                FileOutputStream fos = new FileOutputStream(
                        "d:\\work\\wombex\\WombexUK\\AcrossHealth\\byte_test_new.xml");
                fos.write(correctedBytes);
                fos.close();

                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder;
                Document doc = null;
                String encapsulatedBinaryData = "";
                try {
                    dBuilder = dbFactory.newDocumentBuilder();
                    try {
                        doc = dBuilder.parse(new ByteArrayInputStream(correctedBytes));
                        //new FileInputStream("c:\\work\\wombex\\WombexUK\\AcrossHealth\\byte_test.xml"));
                        NodeList binaryNodes;
                        binaryNodes = doc.getElementsByTagName("xio:hfa_II_serial_binhex");
                        if (binaryNodes.getLength() > 0) {
                            encapsulatedBinaryData = binaryNodes.item(0).getTextContent();
                        }

                    } catch (SAXException ex) {
                        Logger.getLogger(DICOMParser.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } catch (ParserConfigurationException ex) {
                    Logger.getLogger(DICOMParser.class.getName()).log(Level.SEVERE, null, ex);
                }

                debugMessage(encapsulatedBinaryData);

                /*FileOutputStream decf = new FileOutputStream("c:\\work\\wombex\\WombexUK\\AcrossHealth\\decompressed.bin");
                String todecompress = encapsulatedBinaryData.substring(413,500);
                debugMessage(todecompress);
                decompressor.decompress(new ByteArrayInputStream(todecompress.getBytes()), decf);
                decf.close();
                */
                extractEncapsulatedBinData(encapsulatedBinaryData);

            } catch (IOException ex) {
                Logger.getLogger(DICOMParser.class.getName()).log(Level.SEVERE, null, ex);
            }

            debugMessage(Attrs.getString(parser.getTagInteger("03011008")));

        } else if (Attrs.contains(parser.getTagInteger("77170010"))) {
            debugMessage("Extracting 7717 group...");
            debugMessage("Test name: " + Attrs.getString(parser.getTagInteger("77171001")));
            debugMessage("Test strategy: " + Attrs.getString(parser.getTagInteger("77171002")));
            debugMessage("Stimulus Size: " + Attrs.getString(parser.getTagInteger("77171003")));
            debugMessage("Stimulus Color: " + Attrs.getString(parser.getTagInteger("77171004")));

            debugMessage("Background State: " + Attrs.getString(parser.getTagInteger("77171005")));
            debugMessage("Foveal Result: " + Attrs.getString(parser.getTagInteger("77171006")));
            debugMessage("Screening Mode: " + Attrs.getString(parser.getTagInteger("77171007")));
            debugMessage("Fixation Trials: " + Attrs.getString(parser.getTagInteger("77171008")));
            debugMessage("Fixation Errors: " + Attrs.getString(parser.getTagInteger("77171009")));

            debugMessage("False Positive Percent: " + Attrs.getString(parser.getTagInteger("77171010")));
            debugMessage("False Positive Trials : " + Attrs.getString(parser.getTagInteger("77171011")));
            debugMessage("False Positive Errors: " + Attrs.getString(parser.getTagInteger("77171012")));
            debugMessage("False Negative Percent: " + Attrs.getString(parser.getTagInteger("77171013")));
            debugMessage("False Negative Trials : " + Attrs.getString(parser.getTagInteger("77171014")));
            debugMessage("False Negative Errors: " + Attrs.getString(parser.getTagInteger("77171015")));
            debugMessage("Mean Deviation: " + Attrs.getString(parser.getTagInteger("77171016")));
            debugMessage("Mean Deviation Probability: " + Attrs.getString(parser.getTagInteger("77171017")));
            debugMessage("Pattern Standard Deviation: " + Attrs.getString(parser.getTagInteger("77171018")));
            debugMessage(
                    "Pattern Standard Deviation Probability: " + Attrs.getString(parser.getTagInteger("77171019")));
            debugMessage("Short Term Fluctuation: " + Attrs.getString(parser.getTagInteger("77171020")));
            debugMessage(
                    "Corrected Pattern Standard Deviation: " + Attrs.getString(parser.getTagInteger("77171021")));
            debugMessage("Corrected Pattern Standard Deviation Probability: "
                    + Attrs.getString(parser.getTagInteger("77171022")));
            debugMessage("Glaucoma Hemifield Test: " + Attrs.getString(parser.getTagInteger("77171023")));

            debugMessage("Fixation Monitor: " + Attrs.getString(parser.getTagInteger("77171024")));
            debugMessage("Fixation Target: " + Attrs.getString(parser.getTagInteger("77171025")));
            debugMessage("Pupil Diameter (in mm): " + Attrs.getString(parser.getTagInteger("77171026")));
            debugMessage("Sphere: " + Attrs.getString(parser.getTagInteger("77171027")));
            debugMessage("Cylinder: " + Attrs.getString(parser.getTagInteger("77171028")));
            debugMessage("Axis: " + Attrs.getString(parser.getTagInteger("77171029")));
            debugMessage("Visual Acuity: " + Attrs.getString(parser.getTagInteger("77171030")));
            debugMessage("Short Term Fluctuation Probabilit: " + Attrs.getString(parser.getTagInteger("77171031")));
            debugMessage("Visual Field Index: " + Attrs.getString(parser.getTagInteger("77171034")));
            debugMessage("VFM Sequence:");
            if (Attrs.contains(parser.getTagInteger("77171040"))) {
                Sequence Seq = Attrs.getSequence(parser.getTagInteger("77171040"));
                for (int sq = 0; sq < Seq.size(); sq++) {
                    Attributes AttrData = (Attributes) Seq.get(sq);
                    debugMessage("> Private creator: " + AttrData.getString(parser.getTagInteger("77170010")));
                    debugMessage(">> Section Number: " + AttrData.getString(parser.getTagInteger("77171041")));
                    debugMessage(">> Section Value: " + AttrData.getString(parser.getTagInteger("77171042")));
                }
            }
        }
    }

    private void extractEncapsulatedBinData(String inputData) throws IOException, FileNotFoundException {
        byte[] dataBytes = hexStringToByteArray(inputData);
        FileOutputStream fos;
        fos = new FileOutputStream("d:\\work\\wombex\\WombexUK\\AcrossHealth\\encapsulated_bin_data.bin");
        fos.write(dataBytes);
        fos.close();
    }

    /**
     *
     * @param message
     */
    protected void debugMessage(String message) {
        System.out.println(message);
    }

}