【问题标题】:PdfReader from MemoryStream()来自 MemoryStream() 的 PdfReader
【发布时间】:2013-02-03 01:10:28
【问题描述】:

谁能给我一个如何从MemoryStream 获取PdfReader 的示例?我可以看到PdfReader 类有几个方法看起来可能是候选方法(GetStreamBytesGetStreamBytesRaw),但是这些似乎需要iText 特定的流,我的只是一个普通的Byte[]MemoryStream.

这是使用 C# 和 .NET 4。

iTextSharp.text.pdf.PdfReader rdr = iTextSharp.text.pdf.PdfReader.GetStreamBytesRaw

【问题讨论】:

  • 你的意思是内存流中的pdfreader?您是否正在尝试从已经可用的字节生成 pdf
  • 戴夫,我也遇到了同样的问题。你找到解决办法了吗?

标签: c# itext memorystream pdf-reader


【解决方案1】:

如果您只想使用字节在浏览器中打开 pdf,请执行以下操作:

public void ReturnPDF(byte[] contents, string attachmentFilename)
        {
            var response = HttpContext.Current.Response;
            try
            {
                if (!string.IsNullOrEmpty(attachmentFilename))
                {
                    response.ContentType = "application/pdf";
                    response.AddHeader("Content-Disposition", "attachment; filename=" + attachmentFilename);
                }

                response.ContentType = "application/pdf";
                response.BinaryWrite(contents);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                response.End();
                response.Flush();
                response.Clear();
            }


        }

【讨论】:

  • 我在内存流中有一个 pdf,我需要使用 PdfReader 阅读它。 PdfReader rdr = new PdfReader(pdfstream);引发“未找到 PDF 标头签名”错误。
  • 这通常意味着 pdf 文件已损坏
  • 不确定这个问题在以前的修订版中是否不清楚,但这个答案似乎根本不适用。
【解决方案2】:

可能有点晚了。 尝试将流位置设置为 0。

...
stream.Flush(); // Don't know if this is necessary
stream.Position = 0;
PdfReader reader = new PdfReader(stream.ToArray());
...

【讨论】:

  • PdfReader 是一个静态类。而不是 new PdfReader(stream.ToArray) 现在是 PdfReader.Open(stream)
【解决方案3】:

只要 MemoryStream 是有效的 PDF 对象,您就可以从 MemoryStream 创建 PdfReader。如果 MemoryStream 是一个有效的 PDF 对象,那么启动 PdfReader 的一种方法是:

PdfReader _reader = new PdfReader((byte[])_memoryStream.ToArray());

在下面的代码中,PdfReader 是从 .Net Resource 初始化的,当从 Properties.Resources 对象调用时,该资源作为 byte[] 返回,因此 Resource 和 MemoryStream 向 PdfReader 返回相同的类型,一个字节[]。然后,我从 PdfReader 对象创建一个 PdfStamper 对象,并使用 MemoryStream 作为 PdfStamper 的结果容器。

PdfReader _srcDoc = new PdfReader(Properties.Resources.Resource1);
MemoryStream _output = new MemoryStream();
PdfStamper _scratchDoc = new PdfStamper(_srcDoc, _output);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2020-06-30
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多