从PdfWriter获取字节数组,写入到iTextSharp的内存流

本文关键字:iTextSharp 内存 获取 PdfWriter 字节 字节数 数组 | 更新日期: 2023-09-27 18:03:31

我有一个方法,它接受以下内容:

  • 字节数组,这是一个PDF文件

的想法是它转换一个PDF文件与一个特定的大小,到另一个大小。我想返回一个字节数组,并且想把所有的东西都保存在内存中。

我在构造函数(outPDF)中使用内存流创建PdfWriter,然后进行转换。之后,我想说outBytes = outPDF.ToArray();

我试着把这段代码放在三个地方,看看代码中的地方A, B和C。在位置A,内存流的长度只有255,这不起作用。我猜doc.Close()必须先运行。在位置B和C,流已关闭,无法访问。

因此,我的问题是:如何从PdfWriter获得一个字节数组,写入到iTextSharp的内存流

我的代码:

public static byte[] ConvertPdfSize(byte[] inPDF, LetterSize fromSize, LetterSize toSize)
        {
            if (fromSize != LetterSize.A4 || toSize != LetterSize.Letter)
            {
                throw new ArgumentException("Function only supports from size A4 to size letter");
            }
            MemoryStream outPDF = new MemoryStream();
            byte[] outBytes;
            using (PdfReader pdfr = new PdfReader(inPDF))
            {
                using (Document doc = new Document(PageSize.LETTER))
                {
                    Document.Compress = true;
                    PdfWriter writer = PdfWriter.GetInstance(doc, outPDF);
                    doc.Open();
                    PdfContentByte cb = writer.DirectContent;
                    PdfImportedPage page;
                    for (int i = 1; i < pdfr.NumberOfPages + 1; i++)
                    {
                        page = writer.GetImportedPage(pdfr, i);
                        cb.AddTemplate(page, PageSize.LETTER.Width / pdfr.GetPageSize(i).Width, 0, 0, PageSize.LETTER.Height / pdfr.GetPageSize(i).Height, 0, 0);
                        doc.NewPage();
                    }
                    // place A
                    doc.Close();
                    // place B
                }
                pdfr.Close();
                // place C
            }
            return new byte[0];
        }

从PdfWriter获取字节数组,写入到iTextSharp的内存流

在所有iTextSharp内容完成后返回您的字节,但在丢弃MemoryStream之前

using(MemoryStream outPDF = new MemoryStream())
{
    using (PdfReader pdfr = new PdfReader(inPDF))
    {
        using (Document doc = new Document(PageSize.LETTER))
        {
            //...
        }
    }
    return outPDF.ToArray();
}