C#将PDF文件附加到MemoryStream - 无法访问已关闭的Stream [英] C# Append PDF file to MemoryStream - Cannot access a closed Stream

查看:147
本文介绍了C#将PDF文件附加到MemoryStream - 无法访问已关闭的Stream的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以使用iTextSharp将现有PDF文件附加到动态创建的PDF中?我根据下面的代码尝试使用PdfCopy,但我得到无法访问已关闭的流错误。

Is it possible to append an existing PDF file to a dynamically created PDF using iTextSharp? I have attempted as per my code below using PdfCopy, but I am getting a Cannot access a closed Stream error.

我已经看到将实际PDF文件合并在一起的示例,但我没有存储完成的PDF,只是将MemoryStream输出到FilestreamResult:

I've seen examples merging actual PDF files together, but I am not storing the finished PDFs, simply outputting the MemoryStream to a FilestreamResult:

private readonly float _spacingBefore = 3f;

private readonly float _spacingAfter = 3f;

private readonly float _totalWidth = PageSize.A4.Width - 80;

public MemoryStream CreateMemoryStream()
{
    var document = new Document(PageSize.A4, 25, 25, 30, 30);

    var workStream = new MemoryStream();

    PdfWriter.GetInstance(document, workStream);

    var pdfCopy = new PdfCopy(document, workStream);

    document.Open();

    var pdfPTable = new PdfPTable(1)
    {
        TotalWidth = _totalWidth,
        LockedWidth = true,
        SpacingBefore = _spacingBefore,
        SpacingAfter = _spacingAfter
    };

    float[] widths = { 272f };

    pdfPTable.SetWidths(widths);

    var image = Image.GetInstance(HttpContext.Current.Server.MapPath("\\Images\\Logo.png"));
    image.ScaleToFit(125f, 125f);
    image.Alignment = Image.RIGHT_ALIGN;

    var pdfPCell = new PdfPCell(image)
    {
        Border = 0,
        HorizontalAlignment = Element.ALIGN_RIGHT
    };

    pdfPTable.AddCell(pdfPCell);

    document.Add(pdfPTable);

    pdfCopy.AddDocument(new PdfReader(HttpContext.Current.Server.MapPath("/Documents/Test.pdf")));

    if (document != null)
    {
        document.Close();
    }

    var file = workStream.ToArray();

    var memoryStream = new MemoryStream();
    memoryStream.Write(file, 0, file.Length);
    memoryStream.Position = 0;

    return memoryStream;
}

public FileStreamResult Pdf(int id)
{
    var memoryStream = CreateMemoryStream();

    HttpContext.Response.AddHeader("content-disposition", "inline; filename=" + id + ".pdf");

    return File(memoryStream, "application/pdf");
}

我也试过以下代替 pdfCopy .AddDocument(new PdfReader(HttpContext.Current.Server.MapPath(/ Documents / Test.pdf)));

var pdfReader = new PdfReader(HttpContext.Current.Server.MapPath("/Documents/Test.pdf"));

var numberOfPages = pdfReader.NumberOfPages;

for (var i = 0; i < numberOfPages;)
{
    pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfReader, ++i));
}

无论采用何种方法,我仍然可以获得无法访问一个封闭的流错误。

No matter what approach I still get a Cannot access a closed Stream error.

任何帮助将不胜感激: - )

Any help would be much appreciated :-)

推荐答案

以下是我的问题的解决方案,我希望它对其他人有用:

Below is a solution to my issue, I hope it proves useful to others:

public MemoryStream CreateMemoryStream()
{
    byte[] dynamicPdfBytes;

    using (var dynamicPDfMemoryStream = new MemoryStream())
    {
        using (var document = new Document(PageSize.A4, 25, 25, 30, 30))
        {
            PdfWriter.GetInstance(document, dynamicPDfMemoryStream);

            document.Open();

            var pdfPTable = new PdfPTable(1)
            {
                TotalWidth = _totalWidth,
                LockedWidth = true,
                SpacingBefore = _spacingBefore,
                SpacingAfter = _spacingAfter
            };

            float[] widths = { 272f };

            pdfPTable.SetWidths(widths);

            var image = Image.GetInstance(HttpContext.Current.Server.MapPath("/Images/logo.png"));
            image.ScaleToFit(125f, 125f);
            image.Alignment = Image.RIGHT_ALIGN;

            var pdfPCell = new PdfPCell(image)
            {
                Border = 0,
                HorizontalAlignment = Element.ALIGN_RIGHT
            };

            pdfPTable.AddCell(pdfPCell);

            document.Add(pdfPTable);
        }

        dynamicPdfBytes = dynamicPDfMemoryStream.ToArray();
    }

    byte[] pdfBytes;

    using (var pdfReader = new PdfReader(HttpContext.Current.Server.MapPath("/Documents/Test.pdf")))
    {
        using (var pdfMemoryStream = new MemoryStream())
        {
            var pdfStamper = new PdfStamper(pdfReader, pdfMemoryStream);

            var acroFields = pdfStamper.AcroFields;
            acroFields.SetField("TestField", "This is a test");
            pdfStamper.FormFlattening = true;
            pdfStamper.Close();

            pdfBytes = pdfMemoryStream.ToArray();
        }
    }

    var files = new List<byte[]> { dynamicPdfBytes, pdfBytes };

    byte[] array;

    using (var arrayMemoryStream = new MemoryStream())
    {
        var document = new Document(PageSize.A4, 25, 25, 30, 30);

        var pdfWriter = PdfWriter.GetInstance(document, arrayMemoryStream);

        document.Open();

        var directContent = pdfWriter.DirectContent;

        foreach (var bytes in files)
        {
            var pdfReader = new PdfReader(bytes);

            var numberOfPages = pdfReader.NumberOfPages;

            for (var i = 1; i <= numberOfPages; i++)
            {
                document.NewPage();

                var page = pdfWriter.GetImportedPage(pdfReader, i);

                directContent.AddTemplate(page, 0, 0);
            }
        }

        document.Close();

        array = arrayMemoryStream.ToArray();
    }

    var memoryStream = new MemoryStream();
    memoryStream.Write(array, 0, array.Length);
    memoryStream.Position = 0;

    return memoryStream;
}

这篇关于C#将PDF文件附加到MemoryStream - 无法访问已关闭的Stream的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆