Java 使用dcm4che的工具类getscu下载pacs数据

本文介绍了如何在Java环境下,使用dcm4chee-tool-getscu工具类对接PACS系统并进行数据下载。内容包括SpringBoot和JDK1.8环境准备,dcm4che依赖的添加,getScu工具类创建,以及相关配置文件message.properties和store-tcs.properties的设置。最后进行了测试总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值