2017-09-28 7 views
0

J'essaie de créer un nouveau PdfDocument à partir d'autres PdfDocuments créés en mémoire. Je peux le faire en les enregistrant sur le disque et en les lisant juste, mais je me demandais s'il y avait un moyen de le faire avec juste un flux de mémoire? De cette façon, je pourrais créer les autres pièces en mémoire et les placer dans le nouveau pdf document. Toute aide serait appréciée. Voici ma tentative de le faire avec un flux de mémoire, mais il me semble qu'il manque quelque chose.Créer un nouveau PdfDocument à partir d'autres pièces PdfDocument créées en mémoire avec itext7

using (var stream = new MemoryStream()) 
{ 
    using (var pdfDocument = new PdfDocument(new PdfWriter(stream))) 
    { 
     var doc = new Document(pdfDocument, new PageSize(298f, 178f)); 
     doc.SetMargins(0,0,0,0); 
     var tableInfo = PageElementsFactory.BuildDefaultTable(null, 1); 
     tableInfo.SetMargin(0); 
     tableInfo.SetPadding(0); 
     var cell = PageElementsFactory.BuildDefaultCell(); 
     var dataValue = DataValues[PdfConstValues.RETENTION_INFORMATION_CUSTOMER_NAME]; 
     cell.Add(new Paragraph(dataValue).SetFontSize(12f)); 
     tableInfo.AddCell(cell); 
     var cell2 = PageElementsFactory.BuildDefaultCell(); 
     cell2.Add(new Paragraph(DataValues[PdfConstValues.RETENTION_INFORMATION_ORDER_INFO]).SetBold()); 
     tableInfo.AddCell(cell2); 
     var cell3 = PageElementsFactory.BuildDefaultCell(); 
     cell3.Add(new Paragraph(DataValues[PdfConstValues.RETENTION_INFORMATION_PART_NUMBER]) 
      .SetFontSize(23f).SetBold()); 
     tableInfo.AddCell(cell3); 

     doc.Add(tableInfo); 
     doc.Close(); 
     var page = pdfDocument.GetFirstPage(); 
     var xObject = page.CopyAsFormXObject(newPdfDocument); 
     return new Image(xObject); 
    } 
} 
+1

* « Je peux le faire en les enregistrant sur le disque, puis il suffit de les lire, mais je me demandais s'il y a un moyen de le faire avec juste un flux de mémoire? » * - Qu'est-ce qui vous empêche exactement d'utiliser les instances de 'MemoryStream' au lieu du système de fichiers? Si vous savez comment faire le premier, le dernier devrait être trivial. – mkl

+0

Bonne question. Si j'essaie de lire dans mon flux après l'avoir fermé, j'obtiens une erreur indiquant que je ne peux pas accéder à un flux fermé. Si je ne ferme pas le flux et essaie d'y accéder, j'obtiens une erreur différente: l'en-tête PDF n'est pas trouvé. – Haggis777

Répondre

0

MKL m'a donné quelques idées de son commentaire, et tout ce que je devais faire après un peu plus tâtonnement était proche du PDFDocument puis copiez le flux à un tableau et de créer un nouveau flux de mémoire de celui-ci et BAM! ça a marché.

doc.Add(tableInfo); 
doc.Close(); 
var streamInfo = stream.ToArray(); 
var memstreamClone = new MemoryStream(streamInfo); 
memstreamClone.Position = 0; 
var pdfStreamDoc = new PdfDocument(new PdfReader(memstreamClone)); 
var firstPage = pdfStreamDoc.GetFirstPage(); 
return new Image(firstPage.CopyAsFormXObject(pdfDoc));