2014-10-08 72 views
1

我试图使用此处描述的方法bt kuujinboPDF Compression with iTextSharp使用PDF压缩重建失败

这是我的代码,它导致此错误: “重建失败:未找到预告片;原始消息:未找到PDF startxref。”

  PdfReader reader = new PdfReader(output.ToArray()); 
      ReduceResolution(reader, 9); 

      // Save altered PDF. then you can pass the btye array to a database, etc 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (PdfStamper stamper = new PdfStamper(reader, ms)) 
       { 
       } 

       document.Close(); 
       Response.ContentType = "application/pdf"; 
       Response.AddHeader("Content-Disposition", string.Format("attachment;filename=Produktark-{0}.pdf", myItem.Key)); 
       Response.BinaryWrite(output.ToArray()); 
      } 

我可能会丢失什么?

+0

代码中的* output *变量是什么?该消息似乎表明它不是PDF,至少不是完整的。 – mkl 2015-01-09 05:40:15

回答

3

例外,说明重建失败:...;原消息:...由iText的仅在PdfReader初始化该行

PdfReader reader = new PdfReader(output.ToArray()); 

抛出,即在你的情况,并指示读取的数据,即output.ToArray(),不构成有效的PDF。您也应该将output.ToArray()写入某个文件并检查它。

如果你想知道为什么的消息表明,一些重建失败 ...你居然没有得到最初的错误,但后续之一,PDF消化代码有多个块这样

try { 
    read some part of the PDF; 
} catch(Exception) { 
    try { 
     try to repair that part of the PDF and read it; 
    } catch(Exception) { 
     throw "Rebuild failed: ...; Original message: ..."; 
    } 
} 

在你的情况感兴趣的部分是交叉引用表/流和问题是,PDF startxref(含文档中的交叉引用开始的偏移声明)是找不到

+0

感谢您的意见。 如果我这样做: 'Response.ContentType =“application/pdf”; Response.AddHeader(“Content-Disposition”,string.Format(“attachment; filename = Produktark- {0} .pdf”,myItem.Key)); Response.BinaryWrite(output.ToArray());'它工作,PDF正常呈现。所以当我尝试使用其他代码时会发生什么。 – Martin 2014-10-08 12:52:10

+0

只是要清楚(和@mkl说的),你的异常正在抛出你发布的第一行代码,是否正确?如果是这样的话,代码_after_它是不相关的,它的代码就是我们需要的代码。 – 2014-10-08 13:21:27

+0

*因此,当我尝试使用其他代码时会发生什么情况。* - 您给阅读器的输入已损坏。在某些浏览器中将其返回给PDF渲染器时,显示内容几乎无法证明任何内容,因为这些渲染器通常非常宽容。因此:**你也应该将output.ToArray()写入某个文件并检查它。** – mkl 2014-10-08 13:27:51

0

当我收到此错误消息时,它是由于未关闭用于编辑表单域的PDFStamper而导致的。

Stamper.Close(); 

必须在关闭PDF之前调用或抛出指定的错误。