public R print(PrintOptions options, String callingAE) throws Exception {
Attributes filmSessionAttrs = new Attributes();
Attributes filmBoxAttrs = new Attributes();
Attributes imageBoxAttrs = new Attributes();
Attributes dicomImage = new Attributes();
final String printManagementSOPClass = UID.BasicGrayscalePrintManagementMetaSOPClass;
final String imageBoxSOPClass = UID.BasicGrayscaleImageBoxSOPClass;
List<String> imgStr = options.getImgList();
List<BufferedImage> bfImgList = getBufferImage(imgStr, options);
BufferedImage destImage = getDestImage(bfImgList, options);
storeRasterInDicom(destImage, dicomImage, options.isColorPrint());
Device device = new Device(callingAE);
ApplicationEntity ae = new ApplicationEntity(callingAE);
Connection conn = new Connection();
ApplicationEntity remoteAE = new ApplicationEntity(options.getPrintAE());
Connection remoteConn = new Connection();
ae.addConnection(conn);
ae.setAssociationInitiator(true);
ae.setAETitle(callingAE);
remoteConn.setPort(options.getPrintPort());
remoteConn.setHostname(options.getPrintHost());
remoteConn.setSocketCloseDelay(90);
remoteAE.setAssociationAcceptor(true);
remoteAE.addConnection(remoteConn);
device.addConnection(conn);
device.addApplicationEntity(ae);
ae.addConnection(conn);
device.setExecutor(Executors.newSingleThreadExecutor());
device.setScheduledExecutor(Executors.newSingleThreadScheduledExecutor());
filmSessionAttrs.setInt(Tag.NumberOfCopies, VR.IS, options.getNumOfCopies());
filmSessionAttrs.setString(Tag.PrintPriority, VR.CS, options.getPriority());
filmSessionAttrs.setString(Tag.MediumType, VR.CS, options.getMediumType());
filmSessionAttrs.setString(Tag.FilmDestination, VR.CS, options.getFilmDestination());
filmBoxAttrs.setString(Tag.FilmSizeID, VR.CS, options.getFilmSizeId());
filmBoxAttrs.setString(Tag.FilmOrientation, VR.CS, options.getFilmOrientation());
filmBoxAttrs.setString(Tag.MagnificationType, VR.CS, options.getMagnificationType());
filmBoxAttrs.setString(Tag.SmoothingType, VR.CS, options.getSmoothingType());
filmBoxAttrs.setString(Tag.Trim, VR.CS, options.getTrim());
filmBoxAttrs.setString(Tag.BorderDensity, VR.CS, options.getBorderDensity());
filmBoxAttrs.setInt(Tag.MinDensity, VR.US, options.getMinDensity());
filmBoxAttrs.setInt(Tag.MaxDensity, VR.US, options.getMaxDensity());
filmBoxAttrs.setString(Tag.ImageDisplayFormat, VR.ST, options.getImageDisplayFormat());
imageBoxAttrs.setInt(Tag.ImageBoxPosition, VR.US, options.getImageBoxPosition());
Sequence seq = imageBoxAttrs.ensureSequence(Tag.BasicGrayscaleImageSequence, 1);
seq.add(dicomImage);
final String filmSessionUID = UIDUtils.createUID();
final String filmBoxUID = UIDUtils.createUID();
Attributes filmSessionSequenceObject = new Attributes();
filmSessionSequenceObject.setString(Tag.ReferencedSOPClassUID, VR.UI, UID.BasicFilmSessionSOPClass);
filmSessionSequenceObject.setString(Tag.ReferencedSOPInstanceUID, VR.UI, filmSessionUID);
seq = filmBoxAttrs.ensureSequence(Tag.ReferencedFilmSessionSequence, 1);
seq.add(filmSessionSequenceObject);
AAssociateRQ rq = new AAssociateRQ();
rq.addPresentationContext(new PresentationContext(1, printManagementSOPClass, UID.ImplicitVRLittleEndian));
rq.setCallingAET(ae.getAETitle());
rq.setCalledAET(remoteAE.getAETitle());
Association as = ae.connect(remoteConn, rq);
try {
dimseRSPHandler(as.ncreate(printManagementSOPClass, UID.BasicFilmSessionSOPClass, filmSessionUID,
filmSessionAttrs, UID.ImplicitVRLittleEndian));
DimseRSP ncreateFilmBoxRSP = as.ncreate(printManagementSOPClass, UID.BasicFilmBoxSOPClass, filmBoxUID,
filmBoxAttrs, UID.ImplicitVRLittleEndian);
dimseRSPHandler(ncreateFilmBoxRSP);
ncreateFilmBoxRSP.next();
Attributes imageBoxSequence = ncreateFilmBoxRSP.getDataset().getNestedDataset(Tag.ReferencedImageBoxSequence);
dimseRSPHandler(as.nset(printManagementSOPClass, imageBoxSOPClass, imageBoxSequence.getString(Tag.ReferencedSOPInstanceUID),
imageBoxAttrs, UID.ImplicitVRLittleEndian));
dimseRSPHandler(as.naction(printManagementSOPClass, UID.BasicFilmBoxSOPClass, filmBoxUID, 1,
null, UID.ImplicitVRLittleEndian));
as.ndelete(printManagementSOPClass, UID.BasicFilmBoxSOPClass, filmBoxUID);
as.ndelete(printManagementSOPClass, UID.BasicFilmSessionSOPClass, filmSessionUID);
} catch (Exception e) {
e.printStackTrace();
return R.error(e.getMessage());
} finally {
if (as != null && as.isReadyForDataTransfer()) {
as.waitForOutstandingRSP();
as.release();
}
}
return R.ok();
}