dcm4chee-tool-getscu的使用
记录Java对接pacs系统并进行下载
准备
我这里使用的是springboot+jdk1.8,并且已经在本地安装了一个dcm4chee-arc来模拟pacs系统。
开始
1、修改pom.xml添加dcm4che依赖
<!-- dcm4che start -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.dcm4che.tool</groupId>
<artifactId>dcm4che-tool-common</artifactId>
<version>5.25.2</version>
</dependency>
<dependency>
<groupId>org.dcm4che</groupId>
<artifactId>dcm4che-imageio</artifactId>
<version>5.25.2</version>
</dependency>
<!--dcm end-->
2、创建getScu的工具类
@Component
@Slf4j
public class GetSCU {
public static enum InformationModel {
PatientRoot(UID.PatientRootQueryRetrieveInformationModelGet, "STUDY"),
StudyRoot(UID.StudyRootQueryRetrieveInformationModelGet, "STUDY"),
PatientStudyOnly(UID.PatientStudyOnlyQueryRetrieveInformationModelGet, "STUDY"),
CompositeInstanceRoot(UID.CompositeInstanceRootRetrieveGet, "IMAGE"),
WithoutBulkData(UID.CompositeInstanceRetrieveWithoutBulkDataGet, null),
HangingProtocol(UID.HangingProtocolInformationModelGet, null),
ColorPalette(UID.ColorPaletteQueryRetrieveInformationModelGet, null);
final String cuid;
final String level;
InformationModel(String cuid, String level) {
this.cuid = cuid;
this.level = level;
}
public void adjustQueryOptions(EnumSet<QueryOption> queryOptions) {
if (level == null) {
queryOptions.add(QueryOption.RELATIONAL);
queryOptions.add(QueryOption.DATETIME);
}
}
}
private static ResourceBundle rb =ResourceBundle.getBundle("static/message", Locale.getDefault());;
private static final int[] DEF_IN_FILTER = {
Tag.SOPInstanceUID,
Tag.StudyInstanceUID,
Tag.SeriesInstanceUID
};
private final Device device = new Device("getscu");
private final ApplicationEntity ae;
private final Connection conn = new Connection();
private final Connection remote = new Connection();
private final AAssociateRQ rq = new AAssociateRQ();
private int priority;
private InformationModel model;
private Attributes keys = new Attributes();
private int[] inFilter = DEF_IN_FILTER;
private Association as;
private int cancelAfter;
private static String[] IVR_LE_FIRST = new String[]{
"1.2.840.10008.1.2", "1.2.840.10008.1.2.1",
"1.2.840.10008.1.2.2"};
private static final String DCM_EXT = ".dcm";
private String storageDir = rb.getString("storageDir"); //接收到dicom文件的存储目录
private BasicCStoreSCP storageSCP = new BasicCStoreSCP("*") {
Map<String,String> map=new HashMap<>();
SecurityContext securityContext = SecurityContextHolder.getContext();
@Override
protected void store(Association as, PresentationContext pc, Attributes rq,
PDVInputStream data, Attributes rsp)
throws IOException {
SecurityContextHolder.setContext(securityContext);
rsp.setInt(Tag.Status, VR.US, 0);
if (storageDir == null)
return;
String cuid = rq.getString(Tag.AffectedSOPClassUID);
String iuid = rq.getString(Tag.AffectedSOPInstanceUID);
String tsuid = pc.getTransferSyntax();
Attributes dataset = data.readDataset(tsuid);
String suid = dataset.getString(Tag.SeriesInstanceUID);
<!--自己项目的逻辑-->
final String modality = dataset.getString(Tag.SeriesDescription)+dataset.getString(Tag.Modality);
final String patientNo = dataset.getString(Tag.PatientID);
final String patientName = dataset.getString(Tag.PatientName);
String studyInstanceUid = dataset.getString(Tag.StudyInstanceUID);
map.put("studyInstanceUid",studyInstanceUid);
String child=patientName.replaceAll(" ", "")+"_"+patientNo+(modality.isEmpty()?"NULL":modality.replaceAll(" ",""))+iuid;
//将获取的文件保存到本地
File file = new File(storageDir + "//" + suid, child + DCM_EXT);
if (file.exists()) {
file.delete(