iTextSharp + кнопка «Получить форму» - PullRequest
0 голосов
/ 27 июля 2011

Можно ли с помощью iTextSharp извлечь действие, содержащееся в поле кнопки, содержащемся в файле PDF?

Я хочу знать, какое действие будет выполнять это поле кнопки при нажатии (на MouseUp).

Заранее спасибо

1 Ответ

1 голос
/ 29 июля 2011

Информация о кнопках сохраняется в виде аннотаций в PDF.Я недавно написал здесь код, который перечислил гиперссылки в PDF (также аннотации), и я переназначу его здесь для вас.

Действие кнопки может быть кучейразные вещи, от JavaScript до пунктов меню, до воспроизведения фильма и многое другое.Код ниже обрабатывает JavaScript, именованные действия и действия назначения, остальные я оставлю на ваше усмотрение.Именованные действия зависят от приложения, и я не знаю, есть ли у Adobe список того, чем они все являются.См. Мой пост выше, чтобы узнать, как разрешить действие назначения (ссылка InDirect).

    Dim WorkingFolder As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    Dim WorkingFile As String = Path.Combine(WorkingFolder, "Services.pdf")

    ''//Setup some variables to be used later
    Dim R As PdfReader
    Dim PageCount As Integer
    Dim PageDictionary As PdfDictionary
    Dim Annots As PdfArray
    Dim ActionObject, NamedAction As PdfObject
    Dim DestinationAction As PdfArray
    Dim ActionOjbectID As PdfObject
    Dim ActionDictionary As PdfDictionary

    ''//Open our reader
    R = New PdfReader(WorkingFile)
    ''//Get the page cont
    PageCount = R.NumberOfPages

    ''//Loop through each page
    For I = 1 To PageCount
        ''//Get the current page
        PageDictionary = R.GetPageN(I)

        ''//Get all of the annotations for the current page
        Annots = PageDictionary.GetAsArray(PdfName.ANNOTS)

        ''//Make sure we have something
        If (Annots Is Nothing) OrElse (Annots.Length = 0) Then Continue For

        ''//Loop through each annotation
        For Each A In Annots.ArrayList

            ''//Convert the itext-specific object as a generic PDF object
            Dim AnnotationDictionary = DirectCast(PdfReader.GetPdfObject(A), PdfDictionary)

            ''//Make sure this annotation is a button
            If Not AnnotationDictionary.Get(PdfName.FT).Equals(PdfName.BTN) Then Continue For

            ''//Make sure this annotation has an ACTION
            If AnnotationDictionary.Get(PdfName.A) Is Nothing Then Continue For

            ActionObject = AnnotationDictionary.Get(PdfName.A)

            If ActionObject.IsIndirect Then
                ActionOjbectID = PdfReader.GetPdfObject(AnnotationDictionary.Get(PdfName.A))
                If ActionOjbectID.IsDictionary Then
                    ActionDictionary = DirectCast(ActionOjbectID, PdfDictionary)
                    If ActionDictionary.Get(PdfName.JS) IsNot Nothing Then
                        Trace.WriteLine("JavaScript Action  : " & ActionDictionary.GetAsString(PdfName.JS).ToUnicodeString())
                    ElseIf ActionDictionary.Get(PdfName.N) IsNot Nothing Then
                        NamedAction = ActionDictionary.Get(PdfName.N)
                        Trace.WriteLine("Named Action       : " & NamedAction.ToString())
                    ElseIf ActionDictionary.Get(PdfName.D) IsNot Nothing Then
                        DestinationAction = ActionDictionary.GetAsArray(PdfName.D)
                        Trace.WriteLine("Destination Action : " & DestinationAction.ToString())
                    Else
                        ''//Add a bunch more 
                        Trace.WriteLine("Some other action  : ")
                        For Each K In ActionDictionary.Keys
                            Trace.WriteLine("                   : " & K.ToString())
                        Next
                    End If
                Else
                    ''//Not a dictionary, do something else here, should never reach this
                End If
            Else
                ''//Non InDirect reference, should never reach this
            End If
        Next
    Next

Я должен отметить, что это тянет «действие по умолчанию» для кнопки, но возможно иметь несколько действий для кнопкиразличные состояния.Чтобы получить их, вместо того, чтобы смотреть на PdfName.A, вам нужно взглянуть на PdfName.AA, который даст вам InDirectReference, который вам нужно решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...