Проблема проверки pdf флагов pdfAnnotation.HasFlag error - PullRequest
0 голосов
/ 14 января 2019

Я работаю над инструментом, который проверяет аннотации PDF. Я могу проверить флаги, но получаю сообщение об ошибке на одном конкретном флаге. В чем может быть причина?

    Public Sub GetComments()

    Dim oComments As New PDFcomments
    Dim reader As PdfReader = New PdfReader("C:\Users\jeee\Desktop\1_3047 - Type 1.pdf")
    Dim pdfdocument As New PdfDocument(reader)


    For i As Integer = 1 To pdfdocument.GetNumberOfPages

        Dim pdfPage As PdfPage = pdfdocument.GetPage(i)
        Dim oAnnotations As IList(Of Annot.PdfAnnotation) = pdfPage.GetAnnotations()


        For Each oAnnotation As Annot.PdfAnnotation In oAnnotations

            Dim oAnnotationSubType As PdfName = oAnnotation.GetSubtype

            If oAnnotationSubType.ToString = "/FreeText" Then
                Debug.Print(oAnnotation.GetTitle.ToString)
                Debug.Print(oAnnotation.GetContents.ToString)
                Debug.Print(oAnnotation.GetFlags)

                Debug.Print(oAnnotation.HasFlag(1))
                Debug.Print(oAnnotation.HasFlag(2))
                Debug.Print(oAnnotation.HasFlag(3))
                Debug.Print(oAnnotation.HasFlag(4))

            End If

        Next
    Next

End Sub

System.ArgumentException: «Только один флаг должен быть проверен одновременно.»

Строка, вызывающая ошибку: Debug.Print(oAnnotation.HasFlag(3))

Результаты отладки.

JeEe Тестовая аннотация 4 Ложь Ложные

Примечание: если я поставлю строку Debug.Print(oAnnotation.HasFlag(4)) перед Debug.Print(oAnnotation.HasFlag(3)), ошибка все равно будет в той же строке.

1 Ответ

0 голосов
/ 14 января 2019

HasFlag задокументировано следующим образом:

    /// <summary>
    /// Checks if the certain flag that specifies a characteristic of the annotation
    /// is in enabled state (see ISO-320001 12.5.3, "Annotation Flags").
    /// </summary>
    /// <remarks>
    /// Checks if the certain flag that specifies a characteristic of the annotation
    /// is in enabled state (see ISO-320001 12.5.3, "Annotation Flags").
    /// This method allows only one flag to be checked at once, use constants listed in
    /// <see cref="SetFlag(int)"/>
    /// .
    /// </remarks>
    /// <param name="flag">
    /// an integer interpreted as set of one-bit flags. Only one bit must be set in this integer, otherwise
    /// exception is thrown.
    /// </param>
    /// <returns>true if the given flag is in enabled state.</returns>
    public virtual bool HasFlag(int flag)

Таким образом, параметр должен быть целым числом, интерпретируемым как набор однобитовых флагов. В этом целом числе должен быть установлен только один бит. Очевидно, что для целого числа 3 установлены два бита.

Вы, кажется, думаете, что параметр означает что-то вроде n-й флаг , но на самом деле это означает флаг со значением n .

Допустимые значения: 1, 2, 4, 8, ... но, в частности, не 3.

...