如何以编程方式检测XFA(Adobe XML Forms Architecture)动态PDF

时间:2011-10-12 15:01:52

标签: c# pdf itextsharp xfa

我有一个将pdf转换为tif的系统。基本上它是一个用csharp编写的程序,它使用iTextSharp获取有关pdf和pdf2tif(http://pdftotif.sourceforge.net/)的元数据以转换为该文件。我注意到一些pdf没有正确转换。在Acrobat和Foxit中,它们以多页面形式打开,但在任何其他查看器(Ghostscript ...)中,它们打开为1页文档并带有消息

“要查看此文档的完整内容,您需要更高版本的PDF查看器。您可以从”www.adobe.com/products/acrobat/readstep2.html“升级到最新版本的Adobe Reader。进一步支持,转到http://www.adobe.com/support/products/acrreader.html

有些傻笑告诉我这些是XFA动态PDF有什么方法我可以通过编程方式检测到,所以我可以尝试以不同方式处理这些pdf吗?

2 个答案:

答案 0 :(得分:1)

iText API是一个好的开始。

在iTextSharp中,您可以访问对象的属性,而不是调用方法。 (如果你用iTextSharp完成了大量的工作,你可能已经知道了这一点)

无论如何,这是一个使用HTTP Handler的简单示例:

<%@ WebHandler Language="C#" Class="iTextXfa" %>
using System;
using System.Web;
using iTextSharp.text;  
using iTextSharp.text.pdf;

public class iTextXfa : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    HttpServerUtility Server = context.Server;
    string[] testFiles = { 
      Server.MapPath("./non-XFA.pdf"), Server.MapPath("./XFA.pdf") 
    };
    foreach (string file in testFiles) {
      XfaForm xfa = new XfaForm(new PdfReader(file));
      context.Response.Write(string.Format(
        "<p>File: {0} is XFA: {1}</p>",
        file,
        xfa.XfaPresent ? "YES" : "NO"
      ));
    }
  }
  public bool IsReusable { get { return false; } }
}

答案 1 :(得分:0)

命令行方法:

strings document.pdf | grep XFA

如果你得到一两行,你可能正在使用XFA PDF:

<</Names[(!ADBE::0100_VersChkStrings) 364 0 R(!ADBE::0100_VersChkVars) 365 0 R(!ADBE::0200_VersChkCode_XFACheck) 366 0 R]>>