Как программно определять динамический PDF в формате XFA (Adobe XML Forms Architecture)

У меня есть система, которая преобразует PDF в TIF. По сути, это программа, написанная на csharp, которая использует iTextSharp для получения метаданных о pdf и pdf2tif (http://pdftotif.sourceforge.net/) для преобразования в файл. Я заметил, что некоторые PDF-файлы не конвертируются правильно. В Acrobat и Foxit они открываются как многостраничные формы, но в любом другом средстве просмотра (Ghostscript...) они открываются как одностраничные документы с сообщением

"Для просмотра всего содержимого этого документа вам понадобится более поздняя версия программы просмотра PDF. Вы можете обновить ее до последней версии Adobe Reader по адресу" www.adobe.com/products/acrobat/readstep2.html ". Для дальнейшей поддержки перейдите по http://www.adobe.com/support/products/acrreader.html"

Некоторые из них говорили мне, что это динамические PDF-файлы XFA. Есть ли какой-нибудь способ, которым я могу программно определить это, чтобы я мог попытаться обработать эти PDF-файлы по-другому?

2 ответа

Решение

IText API - хорошее начало.

В iTextSharp вы получаете доступ к свойству объекта вместо вызова метода. (если вы проделали небольшую работу с iTextSharp, вы, вероятно, уже знаете это)

В любом случае, вот простой пример использования обработчика HTTP:

<%@ 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; } }
}

Подход командной строки:

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]>>
Другие вопросы по тегам