我正在使用iTextSharp合并pdf页面。
但他们可能是一些损坏的pdf。
我的问题是,如何以编程方式验证pdf是否已损坏?
答案 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)足够聪明,可以动态修复/修复它们。