『QQ:1353814576』

fo-dicom如何实现print scu 虚拟打印软件发送图像


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);

重新运行程序 虚拟打印机接收到图像了