Dicom文件脱敏的核心代码:
private void dicomFileHandler(File inputFile) {
try {
if (isDicomFile(inputFile)) {
DicomInputStream dicomInputStream = null;
DicomObject dicomObject = null;
//上传dicom文件路径
String fileUploadUrl = null;
try {
dicomInputStream = new DicomInputStream(inputFile);
dicomObject = dicomInputStream.readDicomObject();
dicomInputStream.close();
String studyId = dicomObject.getString(Tag.StudyID);
String seriesIuId = dicomObject.getString(Tag.SeriesInstanceUID);
String studyIuid = dicomObject.getString(Tag.StudyInstanceUID);
String sopInstanceUID = dicomObject.getString(Tag.SOPInstanceUID);
if (StringUtils.isEmpty(seriesIuId) || StringUtils.isEmpty(sopInstanceUID)) {
sendError("Series ID or SOP-ID cannot be read:" + inputFile.getAbsolutePath(), null);
return;
}
String accessNumber = dicomObject.getString(Tag.AccessionNumber);
dicomObject.remove(Tag.PatientID);
dicomObject.putString(Tag.PatientID, VR.PN, accessNumber);
dicomObject.remove(Tag.PatientName);
dicomObject.putString(Tag.PatientName, VR.PN, accessNumber);
dicomObject.remove(0x00611001);
dicomObject.putString(0x00611001, VR.PN, accessNumber);
dicomObject.remove(Tag.InstitutionName);
dicomObject.putString(Tag.InstitutionName, VR.PN, "PANDA");
dicomObject.remove(Tag.ImplementationVersionName);
dicomObject.putString(Tag.ImplementationVersionName, VR.PN, "PANDA");
dicomObject.remove(Tag.OperatorsName);
dicomObject.putString(Tag.OperatorsName, VR.PN, "PANDA");
dicomObject.remove(Tag.InstitutionalDepartmentName);
dicomObject.putString(Tag.InstitutionalDepartmentName, VR.PN, "PANDA");
dicomObject.remove(Tag.InstitutionAddress);
dicomObject.putString(Tag.InstitutionAddress, VR.PN, "PANDA");
dicomObject.remove(Tag.Manufacturer);
dicomObject.putString(Tag.Manufacturer, VR.LO, "PANDA");
Iterator<DicomElement> iterator = dicomObject.datasetIterator();
while (iterator.hasNext()) {
DicomElement dicomElement = iterator.next();
if (dicomElement.tag() > 0x00610000 && dicomElement.tag() < 0x7FDF0000) {
dicomObject.remove(dicomElement.tag());
}
}
FileOutputStream outputStream = new FileOutputStream(inputFile.getAbsolutePath());
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
DicomOutputStream dicomOutputStream = new DicomOutputStream(bufferedOutputStream);
dicomOutputStream.writeDicomFile(dicomObject);
dicomOutputStream.close();
bufferedOutputStream.close();
outputStream.close();
dicomInputStream.close();
dicomInputStream = null;
} finally {
if (dicomInputStream != null) {
dicomInputStream.close();
}
}
} else {
sendError("Non-DICOM File:" + inputFile.getAbsolutePath(), null);
}
} catch (Exception e) {
sendError("Handling file errors:" + inputFile.getAbsolutePath(), e);
}
}
核心代码讲解:
这段代码最重要的作用是打开Dicom文件,并读取其中的核心Tag
这段代码是Dicom文件脱敏的核心实现,可以看到基本上是移除原有的Tag,然后再写入该Tag值
这段代码是对对于处于第 该范围内的所有标签全部移除,很多PACS厂商会在这段里面添加很多的自定义Tag,所以整体移除了.
这段代码是将编辑好的Dicom文件从内存中保存成Dicom文件