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

Java 如何使用dcm4che的工具类下载pacs数据,是movescu还是getscu,如何使用getscu,本地ae信息需要配置吗,有偿请教

以下是使用dcm4che的工具类下载PACS数据的示例代码:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.Tag;
import org.dcm4che3.data.UID;
import org.dcm4che3.io.DicomInputStream;
import org.dcm4che3.net.ApplicationEntity;
import org.dcm4che3.net.Connection;
import org.dcm4che3.net.Device;
import org.dcm4che3.net.MoveDestination;
import org.dcm4che3.net.NetworkException;
import org.dcm4che3.net.PDVInputStream;
import org.dcm4che3.net.QueryRetrieveLevel;
import org.dcm4che3.net.ServiceException;
import org.dcm4che3.net.TransferCapability;
import org.dcm4che3.net.TransferSyntax;

public class PacsDownloader {

    private final Device device = new Device("my-device");
    private final ApplicationEntity ae = new ApplicationEntity("my-ae");
    private final Connection conn = new Connection();

    public PacsDownloader(String host, int port, String callingAETitle) {
        ae.addConnection(conn);
        ae.setAETitle(callingAETitle);
        device.addApplicationEntity(ae);
        conn.setHostname(host);
        conn.setPort(port);
    }

    public void downloadStudy(String studyInstanceUID, String outputPath) throws IOException, ServiceException, NetworkException {
        MoveDestination destination = new MoveDestination(ae.getAETitle(), conn.getHostname(), conn.getPort());
        List<TransferCapability> capabilities = ae.getTransferCapabilities();
        for (TransferCapability capability : capabilities) {
            if (capability.getSopClass().equals(UID.StudyRootQueryRetrieveInformationModelMOVE)) {
                Capability moveCapability = new Capability(capability.getSopClass(), capability.getTransferSyntaxes());
                device.addMoveDestination(destination, moveCapability);
                break;
            }
        }
        device.setAssociationInitiator(ae);
        device.setPackPDV(true);
        device.setRetrieveTimeout(0);
        device.setCalledAET(destination.getAETitle());
        device.connect(conn);
        try {
            device.bind();
            Attributes attrs = new Attributes();
            attrs.setString(Tag.QueryRetrieveLevel, VR.CS, QueryRetrieveLevel.STUDY.name());
            attrs.setString(Tag.StudyInstanceUID, VR.UI, studyInstanceUID);
            attrs.setString(Tag.PatientID, VR.LO, "");
            attrs.setString(Tag.PatientName, VR.PN, "");
            attrs.setString(Tag.StudyID, VR.SH, "");
            attrs.setString(Tag.AccessionNumber, VR.SH, "");
            attrs.setString(Tag.SOPInstanceUID, VR.UI, "");
            attrs.setString(Tag.ModalitiesInStudy, VR.CS, "");

            DicomInputStream dis = new DicomInputStream(device.move(
                    destination.getAETitle(), destination.getHostname(), destination.getPort(),
                    ae.getAETitle(), UID.StudyRootQueryRetrieveInformationModelMOVE, attrs,
                    TransferSyntax.ImplicitVRLittleEndian, this));
            try {
                File outputDir = new File(outputPath);
                outputDir.mkdirs();
                Attributes fmi = dis.readFileMetaInformation();
                Attributes attrs;
                while ((attrs = dis.readDataset(fmi, -1, Tag.PixelData)) != null) {
                    String sopInstanceUID = attrs.getString(Tag.SOPInstanceUID);
                    String fileName = outputDir.getAbsolutePath() + File.separator + sopInstanceUID + ".dcm";
                    try (FileOutputStream fos = new FileOutputStream(fileName)) {
                        PDVInputStream pdvIs = new PDVInputStream(dis);
                        byte[] buffer = new byte[1024];
                        int bytesRead;
                        while ((bytesRead = pdvIs.read(buffer)) != -1) {
                            fos.write(buffer, 0, bytesRead);
                        }
                    }
                }
            } finally {
                dis.close();
            }
        } finally {
            device.unbind();
        }
    }

    public static void main(String[] args) throws Exception {
        String host = "localhost";
        int port = 11112;
        String callingAETitle = "my-ae";
        String studyInstanceUID = "1.2.3.4.5"; // replace with actual study instance UID        String outputPath = "/path/to/output/directory";
        PacsDownloader downloader = new PacsDownloader(host, port, callingAETitle);
        downloader.downloadStudy(studyInstanceUID, outputPath);
    }
}

在上述代码中,我们使用dcm4che的Device和ApplicationEntity类创建了一个DICOM设备和应用程序实体。我们使用Connection类指定了PACS服务器的主机名和端口号,并在ApplicationEntity中添加了一个连接。我们使用TransferCapability类指定了我们要使用的传输能力。然后,我们将DICOM设备绑定到PACS服务器,并使用move方法从PACS服务器中检索数据。在检索数据时,我们使用DcmInputStream类和PDVInputStream类将数据流式传输到本地文件系统中的文件中。