如何在C#中使用iTextSharp合并之前知道损坏的PDF文件

时间:2011-11-24 06:21:31

标签: c# itextsharp

我正在使用iTextSharp合并pdf页面。

但他们可能是一些损坏的pdf。

我的问题是,如何以编程方式验证pdf是否已损坏?

2 个答案:

答案 0 :(得分:1)

我经常检查文件的标题以查看它是什么类型的文件。 PDF标题始终以%PDF开头。

当然,文件可能在标题之后被破坏,然后我不确定是否还有其他方法,而不仅仅是尝试打开并从文档中读取。当文件损坏时,从该文档打开OR读取可能会出现异常。我不确定iTextSharp会抛出各种异常,但我认为你可以测试它。

答案 1 :(得分:0)

一种方法,因为你要合并文件,就是将你的代码包装在try...catch块中:

Dictionary<string, Exception> errors = 
  new Dictionary<string, Exception>();
document.Open();
PdfContentByte cb = writer.DirectContent;
foreach (string filePath in testList) {
  try {
    PdfReader reader = new PdfReader(filePath);
    int pages = reader.NumberOfPages;
    for (int i = 0; i < pages; ) {
      document.NewPage();
      PdfImportedPage page = writer.GetImportedPage(reader, ++i);
      cb.AddTemplate(page, 0, 0);
    }
  }
// **may** be PDF spec, but not supported by iText      
  catch (iTextSharp.text.exceptions.UnsupportedPdfException ue) {
    errors.Add(filePath, ue);
  }
// invalid according to PDF spec
  catch (iTextSharp.text.exceptions.InvalidPdfException ie) {
    errors.Add(filePath, ie);
  }
  catch (Exception e) {
    errors.Add(filePath, e);
  }
}
if (errors.Keys.Count > 0) {
  document.NewPage();
  foreach (string key in errors.Keys) {
    document.Add(new Paragraph(string.Format(
      "FILE: {0}\nEXCEPTION: [{1}]: {2}",
      key, errors[key].GetType(), errors[key].Message
    )));
  }
}

其中testList是您要合并的PDF文档的文件路径的集合。

另外,您还需要考虑您定义为 corrupt 的内容。有许多PDF文档不符合PDF规范,但有些读者(Adobe Reader)足够聪明,可以动态修复/修复它们。