Информация о кнопках сохраняется в виде аннотаций в 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
, который вам нужно решить.