2015-02-21 2 views
1

Я использую C#. Я искал и искал способ сделать это. Я нашел plenty of examples при добавлении действий к полям PDF-формы с использованием iTextSharp, но ничего не прочитывает существующие действия.Как вы получаете существующие действия iTextSharp AcroField?

У меня есть существующие PDF с формой подтверждения (альфа, буквенно-цифровой и т.д.) я создаю программу для заполнения этих форм, и мне нужно программно проверить, какие символы действительны (обычно делается с JavaScript и Regex из того, что я видел.)

Есть ли способ получить этот JavaScript, чтобы моя программа могла проверить ввод?

+0

Пытался ли вы ищете внутри PDF с помощью [IText RUPS] (http://itextpdf.com/product/itext_rups). JavaScript можно связать как действие с JS в потоке, но вы также можете называть JavaScript в дереве имен (часть каталога). Взгляд под капот PDF поможет вам написать код для извлечения JavaScript программно. –

+0

Блестящий! Используя это, я узнал о XFA и используя метод в ответе на [этот вопрос] (http://stackoverflow.com/questions/14864669/itextsharp-xfa-document-in-c-sharp), я смог прочитать полный поток как XML! Теперь я могу просто разобрать это, чтобы получить всю необходимую мне информацию. Спасибо огромное! – GeoStyx

+0

В iText мы постоянно используем RUPS. Мы написали инструмент, потому что нам надоело отлаживать PDF в текстовом редакторе и писать код для извлечения сжатого потока для изучения :-) –

ответ

1

Оказывается, мне нужно читать полный поток XFA, чтобы получить все подробности о полях формы.

Этот код из this answer по this user получит полный РФ поток:

public string ReadXfa(PdfReader reader) { 
    XfaForm xfa = new XfaForm(reader); 
    XmlDocument doc = xfa.DomDocument; 
    reader.Close(); 

    if (!string.IsNullOrEmpty(doc.DocumentElement.NamespaceURI)) { 
    doc.DocumentElement.SetAttribute("xmlns", ""); 
    XmlDocument new_doc = new XmlDocument(); 
    new_doc.LoadXml(doc.OuterXml); 
    doc = new_doc; 
    } 

    var sb = new StringBuilder(4000); 
    var Xsettings = new XmlWriterSettings() {Indent = true}; 
    using (var writer = XmlWriter.Create(sb, Xsettings)) { 
    doc.WriteTo(writer); 
    } 
    return sb.ToString();  
} 
Смежные вопросы