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>