Как программно определять динамический 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]>>