使用VB.net在PDF中创建换行符

3

我有一个应用程序,它从集合中的项目创建列表。然后对于每个项目,我将其添加到一个空字符串中,然后在其末尾添加换行符。因此,理想情况下,我的字符串将如下所示:

List1\nList2\nList3\n

生成此字符串后,我发送它以放置在pdf的占位符中。如果我在简单的控制台应用程序中尝试此代码,则会将所有内容打印在新行中。但是在我的现实世界中,我必须将其打印到pdf中。这些项目只显示为它们之间的空格而不是新行。如何格式化我的字符串,以便pdf识别换行符而不是忽略它?

以下是生成具有换行符的字符串的代码:

    Private Function ConcatPlacardNumbers(ByVal BusinessPlacardCollection As BusinessPlacardCollection) As String
    Dim PlacardNumbersList As String = Nothing
    Dim numberofBusinessPlacards As Long = BusinessPlacardCollection.LongCount()
    For Each BusinessPlacard As BusinessPlacard In BusinessPlacardCollection
        numberofBusinessPlacards = numberofBusinessPlacards - 1
        PlacardNumbersList = String.Concat(PlacardNumbersList, BusinessPlacard.PlacardNumber)
        If numberofBusinessPlacards <> 0 Then
            PlacardNumbersList = String.Concat(PlacardNumbersList, Enviornment.newline)
        End If
    Next
    Return PlacardNumbersList
End Function

你使用哪个组件或工具来生成PDF? - competent_tech
我不是很确定,因为这是一个大型应用程序,但似乎有一个名为DocumentGenerationManager的类,其中包含一个GenerateDocument()方法,该方法然后使用DataMerger合并所有数据。由于我是公司的新手,仍在努力学习应用程序中的所有工作原理。 - marco
2个回答

1
答案取决于用于生成PDF的工具。由于换行符不起作用,我建议尝试使用\n。另一种可能是PDF生成代码没有设计为发出多行;您只能通过检查生成代码来确定这一点。
但是,您的代码存在一个重大性能问题:您将使用此代码生成大量字符串对象。您应该更改设计以使用System.Text.StringBuilder,这将极大地提高性能:
Private Function ConcatPlacardNumbers(ByVal BusinessPlacardCollection As BusinessPlacardCollection) As String
    Dim PlacardNumbersList As New System.Text.StringBuilder(10000)
    For Each BusinessPlacard As BusinessPlacard In BusinessPlacardCollection
        If PlacardNumbersList.Length <> 0 Then
            ' This is equivalent to Environment.NewLine
            'PlacardNumbersList.AppendLine()
            ' The attempt to use \n
            PlacardNumbersList.Append("\n")
        End If
        PlacardNumbersList.Append(BusinessPlacard.PlacardNumber)
    Next
    Return PlacardNumbersList.ToString
End Function

请注意,您也不需要跟踪广告牌编号:在第一次之后的每个传递中,您可以将换行符添加到上一个项目的末尾。

谢谢。性能方面的观点很好。使用您上面提供的内容,输出为:"ABCNNN\nABCMMM\nABCVVV\n"如果我使用Enviornment.Newline,则会是:"ABCNNN ABCMMM ABCVVV"所以这仍然没有给我一个新行。但我明白这完全取决于生成pdf的应用程序以及它如何处理pdf。我可能需要与我的同事商量一下,看看他们正在使用的pdf生成工具的背景情况。 - marco
我添加了 \n 作为一个选项,以防万一生成 PDF 的代码正在寻找它而不是 CrLf。值得一试,看看是否有效。 - competent_tech

1
尝试添加\u2028
Private Function ConcatPlacardNumbers(ByVal BusinessPlacardCollection As _
                                      BusinessPlacardCollection) As String

    Dim PlacardNumbersList As New StringBuilder()

    For Each BusinessPlacard As BusinessPlacard In BusinessPlacardCollection

        PlacardNumbersList.Append(BusinessPlacard.PlacardNumber)
        'PlacardNumbersList.Append(ChrW(8232)) '\u2028 line in decimal form
        PlacardNumbersList.Append(ChrW(8233)) '\u2029 paragr. in decimal form

    Next

    Return PlacardNumbersList.ToString

End Function

如果需要段落,请使用\u2029。更多详情请参考:
http://blogs.adobe.com/formfeed/2009/01/paragraph_breaks_in_plain_text.html


谢谢,我认为这可能是我的解决方案。但是VB.Net不使用斜杠或更好的是,不识别它们。那么在VB.net中,\u2029的等效物是什么?这在C#中可以用。 - marco
嗯,你说得对。只需将表示为十六进制的两个字节转换为数字即可。我已更新我的答案,附上了相应的十进制数。 - user1693593

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接