医疗影像dcm通过AET推送

package *;

import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.Tag;
import org.dcm4che3.data.VR;
import org.dcm4che3.io.DicomInputStream;
import org.dcm4che3.net.*;
import org.dcm4che3.net.pdu.AAssociateRQ;
import org.dcm4che3.net.pdu.PresentationContext;
import org.dcm4che3.util.StreamUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

public class CStoreSCU {
    private Device device;
    private ApplicationEntity ae;
    private Connection conn;

    public CStoreSCU(String callingAET) {
        device = new Device("c-store-scu");
        ae = new ApplicationEntity(callingAET);
        conn = new Connection();
        // enable Asynchronous Operations
        conn.setMaxOpsInvoked(0);
        conn.setMaxOpsPerformed(0);
        device.addApplicationEntity(ae);
        device.addConnection(conn);
        ae.addConnection(conn);
    }

    public void setExecutor(Executor executor) {
        device.setExecutor(executor);
    }

    public void setScheduledExecutor(ScheduledExecutorService executor) {
        device.setScheduledExecutor(executor);
    }

    public void store(String calledAET, String hostName, int port, List<File> files) throws IOException, InterruptedException, GeneralSecurityException, IncompatibleConnectionException {
        Map<Boolean, List<DicomFile>> parsedFiles = files.stream().map(DicomFile::new).collect(Collectors.partitioningBy(DicomFile::failed));
        parsedFiles.get(true).forEach(DicomFile::logError);
        List<DicomFile> dicomFiles = parsedFiles.get(false);
        if (dicomFiles.isEmpty()) {
            throw new RuntimeException("解析dcm 有误 ");
        }
        Association as = ae.connect(mkConnection(hostName, port), mkAARQ(calledAET, dicomFiles));
        for (DicomFile dicomFile : dicomFiles) {
            try {
                as.cstore(dicomFile.cuid, dicomFile.iuid, Priority.NORMAL, dicomFile, dicomFile.tsuid, new DimseRSPHandler(as.nextMessageID()));
            } catch (IOException e) {
                String s = String.format("Failed to send %s to %s - %s%n", dicomFile.file.toString(), calledAET, e.getMessage());
                throw new RuntimeException(s);
            }
        }
        as.waitForOutstandingRSP();
        as.release();
    }

    private AAssociateRQ mkAARQ(String calledAET, List<DicomFile> dicomFiles) {
        AAssociateRQ aarq = new AAssociateRQ();
        aarq.setCallingAET(ae.getAETitle()); // optional: will be set in ae.connect() if not explicitly set.
        aarq.setCalledAET(calledAET);
        dicomFiles.stream().filter(e -> !aarq.containsPresentationContextFor(e.cuid, e.tsuid)).forEach(e -> aarq.addPresentationContext(new PresentationContext(aarq.getNumberOfPresentationC

使用时导入相关依赖包即可。

<dcm4che.version>5.17.1</dcm4che.version>

<dependency>
            <groupId>org.dcm4che</groupId>
            <artifactId>dcm4che-core</artifactId>
            <version>5.17.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.dcm4che</groupId>
            <artifactId>dcm4che-imageio</artifactId>
            <version>${dcm4che.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.dcm4che</groupId>
            <artifactId>dcm4che-imageio-rle</artifactId>
            <version>${dcm4che.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.dcm4che</groupId>
            <artifactId>dcm4che-net</artifactId>
            <version>${dcm4che.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>org.dcm4che.tool</groupId>-->
            <!--<artifactId>dcm4che-tool-emf2sf</artifactId>-->
            <!--<version>${dcm4che.version}</version>-->
            <!--<exclusions>-->
                <!--<exclusion>-->
                    <!--<groupId>org.slf4j</groupId>-->
                    <!--<artifactId>slf4j-log4j12</artifactId>-->
                <!--</exclusion>-->
                <!--<exclusion>-->
                    <!--<groupId>log4j</groupId>-->
                    <!--<artifactId>log4j</artifactId>-->
                <!--</exclusion>-->
            <!--</exclusions>-->
        <!--</dependency>-->
        <dependency>
            <groupId>org.dcm4che.tool</groupId>
            <artifactId>dcm4che-tool-common</artifactId>
            <version>${dcm4che.version}</version>
        </dependency>
请登录后发表评论