-1

在 Acroform PDF 文档中使用 iTextSharp 生成或重新生成多选列表框时,我在 Adob​​e Reader DC 中得到了不需要的结果。

问题:在 Adob​​e Reader DC 中查看修改后的 PDF 时,PDF 表单在列表框的开头缺少取消选择的显示项目。例如:“一”、“二”、“三”、“四”、“五”是列表项;并选择“二”和“四”;那么前面的项目,如“一个”,缺少列表框的顶部。列表框中显示的第一项从第一个选择开始,在本例中为“Two”。(参见 Adob​​e Reader DC 截图)

仅供参考:使用 Adob​​e Reader DC,当我在列表框中选择不同的字段选择,然后在列表框外部单击时,列表框字段将恢复为显示所有项目的正常外观。在 Adob​​e Acrobat Professional 8 中打开修改后的 PDF 时,我无法重现此行为,并且所有字段项目都可见并正确选择。在将 PDF 转换为 BMP 或 PNG 时,也可以在 GhostScript 中重现这种缺失的列表项行为。

请回答我的问题:如果这是 iTextSharp 问题或我的语法不正确,请您提供解决此问题的方法。您是否还可以让我知道是否可以使用您的 Adob​​e Reader DC 重现此行为?

谢谢您的支持!

修改后的 Acroform PDF 文档有问题: http ://www.nk-inc.com/listbox-error.pdf

Adobe Reader DC 截图:( 来源:nk-inc.com

ADDITIONAL INFORMATION:
iTextSharp.dll Version: 5.5.6.0
Adobe Reader DC Version: 2015.008.20082
Adobe Acrobat Pro Version: 8.x
Form Type: Acroform PDF

VB.NET 代码(v3.5 - Windows 应用程序):

Imports iTextSharp.text.pdf
Imports iTextSharp.text
Imports System.IO
Public Class listboxTest
    Private Sub RunTest()
        Dim cList As New listboxTest()
        Dim fn As String = Application.StartupPath.ToString.TrimEnd("\") & "\listbox-error.pdf"
        Dim b() As Byte = cList.addListBox(System.IO.File.ReadAllBytes(fn), New iTextSharp.text.Rectangle(231.67, 108.0, 395.67, 197.0), "ListBox1", "ListBox1", 1)
        File.WriteAllBytes(fn, b)
        Process.Start(fn)
    End Sub
    Public Function addListBox(ByVal pdfBytes() As Byte, ByVal newRect As Rectangle, ByVal newFldName As String, ByVal oldfldname As String, ByVal pg As Integer) As Byte()
        Dim pdfReaderDoc As New PdfReader(pdfBytes)
        Dim m As New System.IO.MemoryStream
        Dim b() As Byte = Nothing
        Try
            With New PdfStamper(pdfReaderDoc, m)
                Dim txtField As iTextSharp.text.pdf.TextField
                txtField = New iTextSharp.text.pdf.TextField(.Writer, newRect, newFldName)
                txtField.TextColor = BaseColor.BLACK
                txtField.BackgroundColor = BaseColor.WHITE
                txtField.BorderColor = BaseColor.BLACK
                txtField.FieldName = newFldName 'ListBox1
                txtField.Alignment = 0 'LEFT
                txtField.BorderStyle = 0 'SOLID
                txtField.BorderWidth = 1.0F 'THIN
                txtField.Visibility = TextField.VISIBLE
                txtField.Rotation = 0 'None
                txtField.Box = newRect '231.67, 108.0, 395.67, 197.0
                Dim opt As New PdfArray
                Dim ListBox_ItemDisplay As New List(Of String)
                ListBox_ItemDisplay.Add("One")
                ListBox_ItemDisplay.Add("Two")
                ListBox_ItemDisplay.Add("Three")
                ListBox_ItemDisplay.Add("Four")
                ListBox_ItemDisplay.Add("Five")
                Dim ListBox_ItemValue As New List(Of String)
                ListBox_ItemValue.Add("1X")
                ListBox_ItemValue.Add("2X")
                ListBox_ItemValue.Add("3X")
                ListBox_ItemValue.Add("4X")
                ListBox_ItemValue.Add("5X")
                txtField.Options += iTextSharp.text.pdf.TextField.MULTISELECT
                Dim selIndex As New List(Of Integer)
                Dim selValues As New List(Of String)
                selIndex.Add(CInt(1)) ' SELECT #1 (index)
                selIndex.Add(CInt(3)) ' SELECT #3 (index)
                txtField.Choices = ListBox_ItemDisplay.ToArray
                txtField.ChoiceExports = ListBox_ItemValue.ToArray
                txtField.ChoiceSelections = selIndex
                Dim listField As PdfFormField = txtField.GetListField
                If Not String.IsNullOrEmpty(oldfldname & "") Then
                    .AcroFields.RemoveField(oldfldname, pg)
                End If
                .AddAnnotation(listField, pg)
                .Writer.CloseStream = False
                .Close()
                If m.CanSeek Then
                    m.Position = 0
                End If
                b = m.ToArray
                m.Close()
                m.Dispose()
                pdfReaderDoc.Close()
            End With
            Return b.ToArray
        Catch ex As Exception
            Err.Clear()
        Finally
            b = Nothing
        End Try
        Return Nothing
    End Function
End Class
4

1 回答 1

0

可见列表从第二个条目开始的原因是 iTextSharp 在第一个选定条目处开始绘制列表。

这是对具有比固定文本框区域中显示的条目更多(可能更多)的列表的优化,以便显示的条目包含至少一个有趣的,即选择的条目。

不幸的是,这种优化没有考虑这是否意味着在底部留一些空行,并且在完全适合文本框的列表的情况下,甚至没有滚动条或任何东西。


但 iTextSharp 还提供了一种禁用此优化的方法:您可以手动显式设置第一个可见项:

txtField.ChoiceSelections = selIndex
txtField.VisibleTopChoice = 0 ' Top visible choice is start of list!
Dim listField As PdfFormField = txtField.GetListField

添加此中间线使生成的外观从第一个列表值开始。

于 2016-06-02T15:04:52.913 回答