【问题标题】:Get byte array from PdfWriter, writing to a memorystream in iTextSharp从 PdfWriter 获取字节数组,写入 iTextSharp 中的内存流
【发布时间】:2014-07-04 12:17:53
【问题描述】:

我有一个方法,它包含以下内容:

  • 字节数组,为PDF文件
  • “从”大小
  • “到”大小

这个想法是将具有特定大小的 PDF 文件转换为另一种大小。我想返回一个字节数组,并希望将整个内容保存在内存中。

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

我尝试将这段代码放在三个位置,请参见代码中的 A、B 和 C 位置。在A地,memorystream的长度只有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];
        }

【问题讨论】:

    标签: c# c#-4.0 stream itextsharp bytearray


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      相关资源
      最近更新 更多