Skip to content

Commit

Permalink
feat: use dcm4che dcm2json instead of dcmtk
Browse files Browse the repository at this point in the history
- for more maintainable, we want to drop c++ v8 dcmtk dependency
- just use java and javascript to reduce maintenance difficulty
  • Loading branch information
Chinlinlee committed Jan 7, 2024
1 parent bb4616a commit 89e385b
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 5 deletions.
5 changes: 2 additions & 3 deletions api/fhir-convert/controller/service/fhir-convert.service.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
const { DicomJsonToFhir } = require("dicomjson-to-fhir");
const dicomToJson = require("../dicom-to-fhir");
const { dcm2jsonV8 } = require("@models/DICOM/dcmtk");
const { raccoonConfig } = require("@root/config-class");
const Joi = require("joi");
const { DicomWebServiceError, DicomWebStatusCodes } = require("@error/dicom-web-service");
const { JDcm2Json } = require("@models/DICOM/dcm4che/dcm2json");

const fileSchema = Joi.object({
files: Joi.object({
Expand All @@ -24,7 +23,7 @@ class FhirConvertService {
if (error) {
throw new DicomWebServiceError(DicomWebStatusCodes.InvalidArgumentValue, error.details[0].message, 400);
}
let dicomJson = await dcm2jsonV8.exec(this.request.files.file.filepath);
let dicomJson = await JDcm2Json.get(this.request.files.file.filepath);
let protocol = this.request.secure ? "https" : "http";
let dicomJsonToFhir = new DicomJsonToFhir(
dicomJson,
Expand Down
45 changes: 45 additions & 0 deletions models/DICOM/dcm4che/dcm2json.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@

const path = require("path");
const { importClassAsync } = require("java-bridge");
const { JsonGenerator } = require("@java-wrapper/javax/json/stream/JsonGenerator");
const { JSONWriter } = require("@dcm4che/json/JSONWriter");
const { DicomInputStream } = require("@dcm4che/io/DicomInputStream");
const { File } = require("@java-wrapper/java/io/File");
const { Json } = require("@java-wrapper/javax/json/Json");
const { Common } = require("@java-wrapper/org/github/chinlinlee/dcm777/common/Common");
const { DicomInputStream$IncludeBulkData } = require("@dcm4che/io/DicomInputStream$IncludeBulkData");
const { BasicBulkDataDescriptor } = require("@dcm4che/io/BasicBulkDataDescriptor");


class JDcm2Json {

/**
*
* @param {string} filename
*/
static async get(filename) {
let jFile = new File(filename);
let dicomInputStream = new DicomInputStream(jFile);
await dicomInputStream.setIncludeBulkData(DicomInputStream$IncludeBulkData.NO);
await dicomInputStream.setBulkDataDescriptor(new BasicBulkDataDescriptor());

let JByteArrayOutputStream = await importClassAsync("java.io.ByteArrayOutputStream");
let byteArrayOutputStream = new JByteArrayOutputStream();

let jsonGeneratorFactory = await Json.createGeneratorFactory(
await Common.jsonGeneratorFactoryConfig(false)
);
let jsonGenerator = await jsonGeneratorFactory.createGenerator(byteArrayOutputStream);
let jsonWriter = new JSONWriter(jsonGenerator);

await dicomInputStream.setDicomInputHandler(jsonWriter);
await dicomInputStream.readDataset();
await jsonGenerator.flush();

let jsonStr = await byteArrayOutputStream.toString("UTF-8");
await dicomInputStream.close();
return JSON.parse(jsonStr);
}
}

module.exports.JDcm2Json = JDcm2Json;
Binary file modified models/DICOM/dcm4che/javaNode/dcm4chee/lib/qrscp/dcm777-5.29.2.jar
Binary file not shown.
5 changes: 3 additions & 2 deletions models/DICOM/dicom-json-parser.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { DicomUtf8Converter } = require("./dcm4che/DicomUtf8Converter");
const { JDcm2Json } = require("./dcm4che/dcm2json");
const {
dcm2jsonV8
} = require("./dcmtk");
Expand All @@ -11,7 +12,7 @@ class DicomJsonParser {
async parseFromFilename(filename) {
let dicomJson;
try {
dicomJson = await dcm2jsonV8.exec(filename);
dicomJson = await JDcm2Json.get(filename);
return dicomJson;
} catch (e) {

Expand All @@ -26,7 +27,7 @@ class DicomJsonParser {
let dicomUtf8Converter = new DicomUtf8Converter(filename);
await dicomUtf8Converter.convert();

dicomJson = await dcm2jsonV8.exec(filename);
dicomJson = await JDcm2Json.get(filename);
return dicomJson;
} catch(e) {
throw e;
Expand Down

0 comments on commit 89e385b

Please sign in to comment.