Skip to content

Instantly share code, notes, and snippets.

@swalex
Last active June 4, 2025 22:32
Show Gist options
  • Save swalex/34a6213897958334869ca5d37d7e0177 to your computer and use it in GitHub Desktop.
Save swalex/34a6213897958334869ca5d37d7e0177 to your computer and use it in GitHub Desktop.
Encapsulate (save) PDF with FO-DICOM (into a DCM file)
public static void Encapsulate( Patient patient, Study study, Institution institution, string directory, string filename, byte[] pdf )
{
var name = new DicomPersonName( DicomTag.PatientName, patient.LastName, patient.FirstName,
patient.MiddleName, patient.NamePrefix, patient.NameSuffix );
var studyUID = new DicomUID( study.InstanceUID, "Study Instance UID", DicomUidType.SOPInstance );
var company = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyCompanyAttribute>().Company;
var product = Assembly.GetEntryAssembly().GetCustomAttribute<AssemblyProductAttribute>().Product;
DicomDataset[] refItems = study.Series
.SelectMany( s => s.Datasets )
.Select( d => new DicomDataset
{
{ DicomTag.ReferencedSOPClassUID, d.ClassUID },
{ DicomTag.ReferencedSOPInstanceUID, d.InstanceUID }
} ).ToArray();
var sourceInstances = new DicomSequence( DicomTag.SourceInstanceSequence, refItems );
var conceptName = new DicomSequence( DicomTag.ConceptNameCodeSequence );
var generator = new DicomUIDGenerator();
var dataset = new DicomDataset
{
{ DicomTag.SpecificCharacterSet, series.SpecificCharacterSet },
{ DicomTag.InstanceCreationDate, DateTime.Now },
{ DicomTag.InstanceCreationTime, DateTime.Now },
{ DicomTag.SOPClassUID, DicomUID.EncapsulatedPDFStorage },
{ DicomTag.SOPInstanceUID, generator.Generate() },
{ DicomTag.StudyDate, study.DateTime.Date },
{ DicomTag.ContentDate, DateTime.Now },
{ DicomTag.AcquisitionDateTime, DateTime.Now },
{ DicomTag.StudyTime, study.DateTime },
{ DicomTag.ContentTime, DateTime.Now },
{ DicomTag.AccessionNumber, study.AccessionNumber.ToString( CultureInfo.InvariantCulture ) },
{ DicomTag.Modality, "DOC" },
{ DicomTag.ConversionType, "WSD" },
{ DicomTag.ImageLaterality, planning.PatientSide },
{ DicomTag.Manufacturer, company },
{ DicomTag.ManufacturerModelName, product },
{ DicomTag.ReferringPhysicianName, (string)null },
{ DicomTag.PatientID, patient.ID },
{ DicomTag.PatientBirthDate, patient.BirthDate },
{ DicomTag.PatientSex, patient.Sex },
{ DicomTag.StudyInstanceUID, study.InstanceUID },
{ DicomTag.StudyDescription, study.Description },
{ DicomTag.SeriesInstanceUID, generator.Generate( studyUID ) },
{ DicomTag.SeriesDescription, $"{product} {planning.Description}" },
{ DicomTag.PerformingPhysicianName, Environment.UserName },
{ DicomTag.SeriesDate, DateTime.Now },
{ DicomTag.SeriesTime, DateTime.Now },
{ DicomTag.StudyID, study.ID },
{ DicomTag.SeriesNumber, planning.Series.OrderBy( s => s.Number ).Last().Number + 1 },
{ DicomTag.InstanceNumber, 1 },
{ DicomTag.BurnedInAnnotation, "YES" },
{ DicomTag.DocumentTitle, $"{product} Generated Document" },
{ DicomTag.VerificationFlag, "UNVERIFIED" },
{ DicomTag.MIMETypeOfEncapsulatedDocument, "application/pdf" },
name,
sourceInstances,
conceptName,
{ DicomTag.EncapsulatedDocument, pdf }
};
dataset.Add( DicomTag.InstitutionName, institution.Name );
dataset.Add( DicomTag.InstitutionAddress, institution.Address );
dataset.Add( DicomTag.InstitutionalDepartmentName, institution.Department );
var dicomFile = new DicomFile( dataset );
using ( var file = new FileStream( Path.Combine( directory, filename ), FileMode.Create ) )
{
dicomFile.Save( file );
}
}
@yebYazilim
Copy link

yebYazilim commented Jun 4, 2025

Association Abort [source: ServiceProvider; reason: InvalidPDUParameter] I get an error, what could be the cause? I get this error when sending to pacs server.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment