iText7 - 表格问题中显示的文字

时间:2018-02-16 14:28:55

标签: .net vb.net text itext7

我正在为 .Net 使用 iText7 库,我对显示的文字有一个非常奇怪的问题。说明:

上下文 - 在我的业务流程中,有以下步骤:

  1. 从只有一页的RadDiagram(Télérik)加载PDF文件,并将其保存为Byte()在我的数据库中。此操作可以多次完成。
  2. 从数据库中获取所有PDF文件。
  3. 对于每个PDF文件,请插入一个表格。
  4. 连接一个全局文件中的所有文件。
  5. 我在步骤1和步骤1中使用了一种方法。 3.此方法将在PDF文档中创建并插入表:

       Private Function CreateWorkOrderHeaderTable() As Table
            Dim wLabels As Single = CSng(ReportPageSize.GetWidth * 0.06)
            Dim wValues As Single = CSng(ReportPageSize.GetWidth * 0.14)
            Dim workOrderHeaderTable As Table = New Table({ReportPageSize.GetWidth})
    
            Dim topHeaderTable As Table = New Table({(wLabels), (wValues), (wLabels), (wValues), (wLabels), (wValues), (wLabels), (wValues), (wLabels), (wValues)})
            topHeaderTable.SetBorder(Borders.Border.NO_BORDER)
    
            Dim headerNames As New List(Of String)
            Dim headerValues As New List(Of String)
            Dim emptyHeaderValues As New List(Of String)(New String() {"", "", ""})
            Dim headerLabelsTable As Table
            Dim headerValuesTable As Table
    
            headerLabelsTable = New Table({wLabels})
            headerNames = New List(Of String)(New String() {"CA Name", "Article", "Serial #"})
            headerNames.ForEach(Sub(headerName) headerLabelsTable.AddCell(New Cell().Add(String.Format("{0} :", headerName)).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.RIGHT).SetBorder(Borders.Border.NO_BORDER).SetBackgroundColor(ColorConstants.LIGHT_GRAY)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerLabelsTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerValuesTable = New Table({wValues})
            headerValues = If((Me._currentMeasure IsNot Nothing), New List(Of String)(New String() {Me._currentMeasure.CA_Name, Me._currentMeasure.JDS.DS, Me._currentMeasure.SN}), emptyHeaderValues)
            headerValues.ForEach(Sub(headerValue) headerValuesTable.AddCell(New Cell().Add(headerValue).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.LEFT).SetBorder(Borders.Border.NO_BORDER)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerValuesTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerLabelsTable = New Table({wLabels})
            headerNames = New List(Of String)(New String() {"Program", "Standard", "Desc."})
            headerNames.ForEach(Sub(headerName) headerLabelsTable.AddCell(New Cell().Add(String.Format("{0} :", headerName)).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.RIGHT).SetBorder(Borders.Border.NO_BORDER).SetBackgroundColor(ColorConstants.LIGHT_GRAY)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerLabelsTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerValuesTable = New Table({wValues})
            headerValues = If((Me._currentMeasure IsNot Nothing), New List(Of String)(New String() {Me._currentMeasure.MM_Program, Me._currentMeasure.SelectedCA.Standard, Me._currentMeasure.CA_Description}), emptyHeaderValues)
            TrunkStringItems(headerValues, MAX_CHAR_BY_WORK_ORDER_PROP)
            headerValues.ForEach(Sub(headerValue) headerValuesTable.AddCell(New Cell().Add(headerValue).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.LEFT).SetBorder(Borders.Border.NO_BORDER)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerValuesTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerLabelsTable = New Table({wLabels})
            headerNames = New List(Of String)(New String() {"Station", "WorkShop", "Machine"})
            headerNames.ForEach(Sub(headerName) headerLabelsTable.AddCell(New Cell().Add(String.Format("{0} :", headerName)).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.RIGHT).SetBorder(Borders.Border.NO_BORDER).SetBackgroundColor(ColorConstants.LIGHT_GRAY)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerLabelsTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerValuesTable = New Table({wValues})
            headerValues = If((Me._currentMeasure IsNot Nothing), New List(Of String)(New String() {Me._currentMeasure.Station, Me._currentMeasure.WorkShop, Me._currentMeasure.Machine}), emptyHeaderValues)
            headerValues.ForEach(Sub(headerValue) headerValuesTable.AddCell(New Cell().Add(headerValue).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.LEFT).SetBorder(Borders.Border.NO_BORDER)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerValuesTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerLabelsTable = New Table({wLabels})
            headerNames = New List(Of String)(New String() {"User", "First Name", "Last Name"})
            headerNames.ForEach(Sub(headerName) headerLabelsTable.AddCell(New Cell().Add(String.Format("{0} :", headerName)).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.RIGHT).SetBorder(Borders.Border.NO_BORDER).SetBackgroundColor(ColorConstants.LIGHT_GRAY)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerLabelsTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerValuesTable = New Table({wValues})
            headerValues = If((Me._currentMeasure IsNot Nothing), New List(Of String)(New String() {Me._currentMeasure.Login, Me._currentMeasure.FirstName, Me._currentMeasure.LastName}), emptyHeaderValues)
            headerValues.ForEach(Sub(headerValue) headerValuesTable.AddCell(New Cell().Add(headerValue).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.LEFT).SetBorder(Borders.Border.NO_BORDER)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerValuesTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerLabelsTable = New Table({wLabels})
            headerNames = New List(Of String)(New String() {"MSN", "WO #", "State"})
            headerNames.ForEach(Sub(headerName) headerLabelsTable.AddCell(New Cell().Add(String.Format("{0} :", headerName)).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.RIGHT).SetBorder(Borders.Border.NO_BORDER).SetBackgroundColor(ColorConstants.LIGHT_GRAY)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerLabelsTable.SetBorder(Borders.Border.NO_BORDER)))
    
            headerValuesTable = New Table({wValues})
            headerValues = If((Me._currentMeasure IsNot Nothing), New List(Of String)(New String() {Me._currentMeasure.MSN, Me._currentMeasure.WorkOrder, GetMeasureStatus()}), emptyHeaderValues)
            headerValues.ForEach(Sub(headerValue) headerValuesTable.AddCell(New Cell().Add(headerValue).SetFont(_fontArial).SetFontSize(6).SetTextAlignment(TextAlignment.LEFT).SetBorder(Borders.Border.NO_BORDER)))
            topHeaderTable.AddCell(New Cell().SetBorder(Borders.Border.NO_BORDER).Add(headerValuesTable.SetBorder(Borders.Border.NO_BORDER)))
    
            workOrderHeaderTable.AddCell(New Cell().Add(topHeaderTable).SetBorder(Borders.Border.NO_BORDER))
            workOrderHeaderTable.SetBorder(Borders.Border.NO_BORDER)
    
            Return workOrderHeaderTable
        End Function
    

    我正在使用它:

    tableHeader.AddCell(New Cell().Add(CreateWorkOrderHeaderTable()).SetBorder(Borders.Border.NO_BORDER))
    

    在数据库中保存之前,以及在新PDF文件中从数据库转换Byte()之后,结果为:here

    预期结果 - here

    问题 - 我的问题是我在步骤3中调用此方法。我是出于数据原因调用它(设置值)。桌子位于好地方,背景颜色和尺寸都很好,但文字有一个很大的问题: here

    此外,在步骤3中为另一个页面(未从数据库加载)调用相同的方法,并且我有预期的结果。

    为了绕过这个问题,我尝试用Paragraph对象编写所有文本,而不是像实际那样编写Table和Cell对象。我有同样的问题(here =>我应该有“ CA名称”)

    我认为数据库中的文本编码存在问题,或者叠加问题(来自Byte()的表和PDF文件) 字体以相同的方式注册。

    我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

我找到了绕过问题的解决方案(但如果有人有更好的解决方案,我很感激):

问题:就像上面提到的 @mkl 一样,我通过一些测试证实了这一点,在序列化之前不存在的字符,从数据库转换后它们将不可见如果我想写它们。

旁路:

  1. 我创建了一个u'test text word word-word' ,其中包含了很多可用的字符(在我的情况下,min& maj字母,数字和特殊字符)。
  2. 我使用以下值创建了一个string对象:Paragraph黑色FontColor 0.001 0 <{1}}的<{em>},FontSize 0 X position 200
  3. 我在每个PDF页面中添加了这一段。
  4. ......错误已修复。

    我再说一遍,这不是解决方案,我无法解释为什么会有这个错误,但这是一种可行的方法。