fo-dicom如何实现print scu 虚拟打印软件发送图像
fo-dicom打印PrintScu向模拟打印软件推送打印收不到图像问题
最近碰到了了个比较蛋疼问题 自己使用fo-dicom 开发了printscp、printscu各一个 开发过程中调试互相通信都没啥问题,最后在试着向模拟打印软件(网上很多)推送的时候出现了问题,推送过去对面无法接收到图像 显示有任务 但就是没有图像,被这个卡进度卡了很久。
最后找到一个帖子《用fo-dicom实现print scu的注意事項》有碰到类似问题的可以自行百度看看。 通过这个贴的举例来看 fo-dicom内的例子互相之间通信时没问题的,但是对接第三方的虚拟打印软件就会出现这种情况,至于是什么原因就不深究了,只要能解决问题就成。 大致的解决办法如下:
PrintJob.cs的Print函数里面增加如下代码:
DicomPresentationContext pc = new DicomPresentationContext((byte)0, DicomUID.BasicGrayscalePrintManagementMetaSOPClass);
pc.AddTransferSyntax(DicomTransferSyntax.ImplicitVRLittleEndian);
dicomClient.AdditionalPresentationContexts.Add(pc);
要打印彩色片子,BasicGrayscalePrintManagementMetaSOPClass要相应修改。
在DicomClient.cs中修改public IAsyncResult BeginSend(Stream stream, string callingAe, string calledAe, AsyncCallback callback, object state)函数:
//foreach (var request in _requests)
// assoc.PresentationContexts.AddFromRequest(request);
foreach (var context in _contexts)
assoc.PresentationContexts.Add(context.AbstractSyntax, context.GetTransferSyntaxes().ToArray());
foreach (var pc in assoc.PresentationContexts)
{
foreach (var request in _requests)
{
request.PresentationContext = new DicomPresentationContext(pc.ID,
request.PresentationContext.AbstractSyntax,
pc.AcceptedTransferSyntax,
DicomPresentationContextResult.Proposed);
}
}
在FilmBox.cs的Initialize()函数加入代码:
Add(new DicomSequence(DicomTag.ReferencedFilmSessionSequence));
var item = new DicomDataset();
item.Add(DicomTag.ReferencedSOPClassUID,_filmSession.SOPClassUID);
item.Add(DicomTag.ReferencedSOPInstanceUID,_filmSession.SOPInstanceUID);
var seq = Get<DicomSequence>(DicomTag.ReferencedFilmSessionSequence);
seq.Items.Add(item);
重新运行程序 虚拟打印机接收到图像了