使用itext7从内存中创建的其他PdfDocument片段创建一个新的PdfDocument

时间:2017-09-28 23:40:55

标签: c# itext7

我正在尝试从内存中创建的其他PdfDocuments创建一个新的PdfDocument。我可以通过将它们保存到磁盘然后只是读取它们来做到这一点,但我想知道是否有办法只用内存流来做到这一点?这样我就可以在内存中创建其他部分,并将它们放入新的pdfdocument中。任何帮助,将不胜感激。下面是我尝试用内存流做这个,但我似乎错过了一些东西。

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 个答案:

答案 0 :(得分:0)

mkl从他的评论中给了我一些想法,经过一些更多的试验和错误,我只需关闭pdfdocument然后将流复制到一个数组并从它创建一个新的内存流和BAM!它奏效了。

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