static private PdfTypeArray ConvertContentsToArray(PdfTypeBase contents, PdfIndirectList list, PdfTypeDictionary pageDict) { //check the original content whether it's an array if (contents is PdfTypeArray) { return(contents as PdfTypeArray); //if contents is a array just return it } else if (contents is PdfTypeIndirect) { if ((contents as PdfTypeIndirect).Direct is PdfTypeArray) { return((contents as PdfTypeIndirect).Direct as PdfTypeArray); //if contents is a reference to array then return that array } else if ((contents as PdfTypeIndirect).Direct is PdfTypeStream) { //if contents is a reference to a stream then create a new array and insert stream as a first element of array var array = PdfTypeArray.Create(); array.AddIndirect(list, (contents as PdfTypeIndirect).Direct); //Add array into list of indirect objects list.Add(array); //And set it as a contents of the page pageDict.SetIndirectAt("Contents", list, array); return(array); } else { throw new Exception("Unexcpected content type"); } } else { throw new Exception("Unexcpected content type"); } }
static private void InsertIntoDictionary(PdfDocument doc, PdfPage page, PdfImageObject image) { //Get page dictionary, list of indirect objects and original page content var pageDict = page.Dictionary; var list = PdfIndirectList.FromPdfDocument(doc); //Convert contents to array. PdfTypeArray array = ConvertContentsToArray(pageDict["Contents"], list, pageDict); //Get stream of image. IntPtr streamHandle = Pdfium.FPDFImageObj_GenerateStream(image.Handle, page.Handle); var stream = PdfTypeStream.Create(streamHandle); //Add image's stream into list of indirect objects and then add it to array. int num = list.Add(stream); array.AddIndirect(list, num); }