2011-11-02 94 views
0

MVC 3. Vb.net。我的应用程序的一部分使用Itextsharp生成PDF文件。有些字符串太长,无法正确显示背景图像。所以我基本上需要分割这个字符串,当它的长度超过26个字符,并且它分裂它不能分裂在一个字的中间。从那里我将使用换行符将字符串添加到右边的下一行...任何想法都可能指向正确的方向..我开始建立函数,我将字符串传入测试的长度,然后传回字符串它完成,但我之后stummped以后。根据设置的字符长度拆分字符串

Private Function stringLength(ByVal _string As String) As String 
     If _string.Length < 26 Then 
      _string.Split(
     End If 
    End Function 
+0

这里是AC#回答类似的问题:http://stackoverflow.com/questions/2815021/split-large-text-string-into-variable-长度字符串没有破碎字 它的值得注意的是,虽然大多数字体是可变宽度,所以字符数可能并不实际上对应的像素宽度 –

+0

感谢您的答复..我在这部分气的应用程序...我只会缩小字体,直到他们适合..我对c一无所知,当它转换它的充满错误,我不真正下站..再次感谢.. – Skindeep2366

回答

1

我确信有一百万种不同的方式来做到这一点。

你基本上需要把你的所有单词按空格分成一个列表。之后,您只需要检查当前单词加上空格加上下一个单词是否达到阈值,如果是,则移至下一行。一旦你有所有的线路,然后你重新加入单一字符串列表再次。

Private Function LimitWidth(ByVal text As String, ByVal maxCharacters As Integer) As String 
    Dim words As List(Of String) = text.Split(" "c).ToList() 

    If text.Length < maxCharacters OrElse words.Count = 1 Then 
    Return text 
    Else 
    Dim lines As New List(Of String) 

    Dim currentLine As String = words(0) 
    For i As Integer = 1 To words.Count - 1 
     If (currentLine & " " & words(i)).Length > maxCharacters Then 
     lines.Add(currentLine) 
     currentLine = words(i) 

     If i = words.Count - 1 Then 
      lines.Add(currentLine) 
     End If 
     Else 
     If i = words.Count - 1 Then 
      lines.Add(currentLine & " " & words(i)) 
     End If 

     currentLine &= " " & words(i) 
     End If 
    Next 

    Return String.Join(Environment.NewLine, lines.ToArray()) 
    End If 
End Function 

测试:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
    MessageBox.Show(LimitWidth("This is a really long sentence " & _ 
          "meant to demonstrate how to split " & _ 
          "the words into a confined character length.", 26)) 
End Sub 
+0

感谢您的答复...我实现了它,并使用休息来看看发生了什么......问题是,虽然我在itextsharp中使用contentbyte ..从函数的流和返回的换行符我相信这将字符串拆分成需要的字符串,并在特定的位置插入Newline,然后将其作为一个字符串返回。问题是,contentbyte只是将它视为一行。我正在使用contentbyte来控制项目的页面定位。尽管如此,它仍然是在正确的领域。可能试图让它返回一个字符串列表,这样我就可以把每一行都拉出来。 – Skindeep2366

+0

好,所以这是我的道路上......我删除了environment.newline并在那里放置了一个分隔符......这样它就返回带有分隔符的字符串..然后,我可以从那里相应地分配,并将左侧分配到第一行,并将右侧分配给右侧..我有代码在这里放置,您给我处理分隔符我可以调整它有点..非常感谢.. – Skindeep2366

+0

@ Skindeep2366很高兴提供帮助。 – LarsTech

1

这听起来像你所要求的自动换行功能。

因为我觉得最好是以一种促进学习的方式回答问题,而不仅仅是回答问题,所以我给你一个链接,指导你使用测试驱动开发(TDD)来解决这个问题。恰恰恰巧,单词包装问题是一种流行的编码kata,Robert C. Martin写了一个有点愚蠢的虚构故事,讲述了一位开发人员如何使用TDD解决kata包装问题。

代码示例使用Java语言,但读取和翻译应该是微不足道的。

http://thecleancoder.blogspot.com/2010/10/craftsman-62-dark-path.html

的高飞位是跳跃能够。只需跳到第一个代码片段之前的句子即可。

+0

感谢您的答复。我经历了它并尝试了它。我只是通过vb.net学习我的方式,所以从java到vb.net的转换稍微高于我的曲线..我将缩小pdf上的字体,如果我的客户不喜欢它,我会处理它在时机成熟时。 – Skindeep2366