【问题标题】:Split output result by n and loop按 n 和循环拆分输出结果
【发布时间】:2018-05-14 19:55:55
【问题描述】:

我正在解决一个需要创建一个 PDF 表单的问题。

该 PDF 表单有 8 个部分,我需要在其中放置信息,并且看起来像图片所示(仅显示 4 个)。

关键是我的查询将返回 0 - n 个不同的结果。所以我需要除以 8 并在不同的页面上发布。

我尝试如下所示,但这似乎不起作用,因为我总是加载新文档。有人对如何制作有一些建议吗?

Try
    Dim sCommand As OleDb.OleDbCommand
    sCommand = New OleDb.OleDbCommand("SELECT a,b,c Query to fetch n results ", _dbCon)
    sCommand.CommandTimeout = 0
    Dim _dbREADER As OleDb.OleDbDataReader
    _dbREADER = sCommand.ExecuteReader
    Dim dt As DataTable = New DataTable()
    dt.Load(_dbREADER)

    Dim totalPages As Integer = dt.Rows.Count / 8
    Dim currentPage As Integer = 1
    Dim rowCounter As Long = 0

    If dt.Rows.Count > 0 Then
        For Each row In dt.Rows
            rowCounter += 1

            If rowCounter = 8 Then
                currentPage += 1
                rowCounter = 0
            End If

            _pdfDocumentOutput = System.IO.Path.GetTempPath() & "MailingForm_" & currentPage & ".pdf"
            SaveFromResources(_pdfDocument, My.Resources.template)

            Using reader As New PdfReader(_pdfDocument)
                Using stamper As New PdfStamper(reader, New IO.FileStream(_pdfDocumentOutput, IO.FileMode.Create))
                    Dim fontName As String = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "SCRIPTIN.ttf")
                    Dim bf As BaseFont = BaseFont.CreateFont(fontName, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)

                    Dim pdfForm As AcroFields = stamper.AcroFields
                    pdfForm.AddSubstitutionFont(bf)
                    pdfForm.SetField(rowCounter - 1 & "0", row("Customer")) 'Checks the top radiobutton of the VrPr4 field
                    pdfForm.SetField(rowCounter - 1 & "1", row("Address"))
                    pdfForm.SetField(rowCounter - 1 & "2", row("Location"))
                    stamper.FormFlattening = True
                End Using
            End Using
        Next
    End If

    Status.Text = "Store info loaded ! "
Catch ex As Exception
    Status.Text = ex.Message
End Try

【问题讨论】:

  • 您的问题包含矛盾。 [1] 你说 我需要创建一个 PDF 表单。 我假设你想从头开始创建一个满足某些要求的交互式 PDF。 [2] 该表单已存在于您的代码中。该文档的路径存储在_pdfDocument 变量中。到那时,满足期望的要求已经太晚了。要么满足,要么不满足。鉴于您发布问题这一事实,可以假设未满足要求。 [2] 与 [1] 相矛盾,因此无法对您的问题发表评论,更不用说回答了。
  • 好吧对不起我的错误解释。关键是我知道我必须得到输出 n 个文件?但它们都基于一个 _pdfDocument,其中包含不同的数据。由于我没有能力重新创建文件并将所有页面放入一个文件中,所以我不得不像我展示的那样使用它。我的回答者是一个解决了我的问题的答案。但由于它不被接受,我仍在寻找更简单的制作方法。至少 LINQ 来拆分数据表而不是那些 for 循环
  • 没有人,但您可以接受自己的问题,因此我不明白您为什么说“因为它不被接受”。如果您需要 n 个文件作为输出(评论的第一部分),您需要创建一个 PdfReader 和一个 PdfStamper n 次。那有什么问题?在评论的第二部分,您似乎想将所有页面放入一个文件中。这很令人困惑。完全不清楚您想要 n 个文档还是单个文档。
  • 我想将所有页面放在一个文件中。但这有可能吗?现在我也接受 n 个文件?关于我的问题,我认为我把它复杂化了,它不应该在 stackoverflow 上
  • 当然可以将所有页面放在一个文件中。你的问题听上去并不复杂,但你的问题太复杂了,以至于没人能回答。

标签: vb.net pdf itext pdf-generation oledb


【解决方案1】:

我通过拆分表找到了解决方案

 Private Shared Function SplitTable(ByVal originalTable As DataTable, ByVal batchSize As Integer) As List(Of DataTable)
        Dim tables As List(Of DataTable) = New List(Of DataTable)()
        Dim i As Integer = 0
        Dim j As Integer = 1
        Dim newDt As DataTable = originalTable.Clone()
        newDt.TableName = "Table_" & j
        newDt.Clear()
        For Each row As DataRow In originalTable.Rows
            Dim newRow As DataRow = newDt.NewRow()
            newRow.ItemArray = row.ItemArray
            newDt.Rows.Add(newRow)
            i += 1
            If i = batchSize Then
                tables.Add(newDt)
                j += 1
                newDt = originalTable.Clone()
                newDt.TableName = "Table_" & j
                newDt.Clear()
                i = 0
            End If

            If row.Equals(originalTable.Rows(originalTable.Rows.Count - 1)) Then
                tables.Add(newDt)
                j += 1
                newDt = originalTable.Clone()
                newDt.TableName = "Table_" & j
                newDt.Clear()
                i = 0
            End If
        Next

        Return tables
    End Function

然后循环遍历每个 table 。并将所有结果放到一个文件中

Dim tables = SplitTable(dt, 8)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2012-09-23
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2013-08-16
    相关资源
    最近更新 更多