Attach file (based on byte[] / MemoryStream) into .pdf without roundtrip to temporary file?

Q:

We are using PdfNet SDK’s functionality to place certain file attachments into .pdfs and currently the code uses a roundtrip via temporary file(s) because the only way I found out was to use something like this:

‘attachmentFilePath’ is a physically existing file on the file system.

using (var pdfDoc = new PDFDoc(pdfFile, pdfFile.Length)) {

pdfDoc.InitSecurityHandler();
pdfDoc.AddFileAttachment(“iRMA Creation .xml File”, FileSpec.Create(pdfDoc, attachmentFilePath, true));
buffer = new byte[1];
var bufferSize = 1;
pdfDoc.Save(ref buffer, ref bufferSize, Base.PdfSaveOptions);
}

… Now is there a more elegant / in-memory way to do this? I have all the attachments there only in memory anyway and would rather not write to the filesystem but the .AddFileAttachment(…) method of the PDFDoc class requires a FileSpec, which again seems to only take strings pointing to existing files.

A:

Yup, you can create a FileSpec from a memory buffer as follows:

FileSpec CreateMyFileSpec(PDFDoc doc, string path, bye[] data) {

Obj fs = doc.CreateIndirectDict();

fs.PutName(“Type”, “Filespec”);

fs.PutString(“F”, path);

fs.PutText(“UF”, path);

fs.PutDict(“EF”).Put(“F”, doc.CreateIndirectStream(data));

return new FileSpec(fs);

}

Then add the file stream as before:

pdfDoc.AddFileAttachment(“iRMA Creation .xml File”, CreateMyFileSpec(pdfDoc, “foo”, data) );