2014-10-08 40 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之前調用或拋出指定的錯誤。