2016-01-13 299 views
0

我正在使用Itext来生成pdf,我需要执行类似Chunk.keepOnSameLine的操作。Itext在块上缺少换行符

我正在构建一个短语,可以有多个由多个块组成的行,当行结束时,我希望块不被破坏。

该块是一个名称和一个日期。例如:“约翰·史密斯(2016年1月13日11:13)”

的代码是一样

Phrase p = new Phrase(); 
    Chunk c1 = new Chunk("FirstName LastName (2016-01-13 11:13)"); 
    p.Add(c1); 
    Chunk c2 = new Chunk("FirstName LastName (2016-01-13 11:13)") 
    p.Add(c2); 
    Chunk c3 = new Chunk("FirstName LastName (2016-01-13 11:13)") 
    p.Add(c3); 
    Chunk c4 = new Chunk("FirstName LastName (2016-01-13 11:13)") 
    p.Add(c4); 
    Chunk c5 = new Chunk("FirstName LastName (2016-01-13 11:13)") 
    p.Add(c5); 
    Chunk c6 = new Chunk("FirstName LastName (2016-01-13 11:13)") 
    p.Add(c6); 
    Chunk c7 = new Chunk("FirstName LastName (2016-01-13 11:13)") 
    p.Add(c7); 

(代码是动态的,所以我不知道将大块存在多少

在结果短语表示像

phrasewithbraks

然后将所得的短语添加到PdfPCell

+0

我见过iText的具有从PDF文件导入文本时插入软连字符的倾向。我不知道相反的情况是否也是如此!您可以尝试在每个块的末尾粘贴一个软的hypen字符,以查看它是否会改变中断行为。 –

+0

是的,问题是连字符是一个突破性的字符... – NunoRibeiro

+0

软连字符不应该被渲染,它的唯一目的是暗示在哪里打破。希望在选择一个任意点来破解之前,它应该在软连字符上突破。 –

回答

0

使用Unicode U+00A0这是一个non-breaking space的文件。您还需要使用U+2011这是一个non-breaking hyphen。但是,从技术角度讲,一个不分断的连字符与常规连字符在技术上是不同的,因此您需要一种支持它的字体。

var testString = "FirstName LastName (2016-01-13 11:13)"; 
var nbsp = "\u00a0"; 
var nbhy = "\u2011"; 

//With a normal space 
var p1 = new Phrase(); 
for (var i = 0; i < 100; i++) { 
    p1.Add(new Chunk(testString + " ")); 
} 
doc.Add(p1); 


//Create a font that supports our "hard hyphen" 
var bf = BaseFont.CreateFont(fontFile, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
var f = new iTextSharp.text.Font(bf, 12); 
testString = testString.Replace(" ", nbsp).Replace("-", nbhy); 

//With a non-breaking space 
var p2 = new Phrase(); 
for (var i = 0; i < 100; i++) { 
    p2.Add(new Chunk(testString + " ", f)); 
} 
doc.Add(p2); 
+0

我已经解决了非破折号连字符的问题,但我放了它,并没有工作。我不明白,因为FONT问题。不,我有一个问题,我所有的字体都被声明为'font_bigBold = new Font(Font.FontFamily.HELVETICA,18,Font.BOLD);''CreateFont'上使用了什么'fontFile'? – NunoRibeiro

+0

PDF规范声明了4种文本字体和1种符号字体(当计数变体时总共14种字体)所有构造函数(如iText和Adobe Reader)必须“知道”,FontFamily.HELVETICA就是其中之一。这些核心文本字体支持7位ASCII标准,但在8位部分有些灰色。从本质上讲,如果你不指定自己的字体,你将会依赖90年代初的字体(或者如果他们是从PostScript开始的话,则是80年代的字体)。 –

3

您可以修改的iText如何通过实现ISplitCharacter和更换默认值(连字符和空格)用自己的分割线:

public class CustomSplitCharacter : ISplitCharacter 
{ 
    public bool IsSplitCharacter(
     int start, int current, int end, char[] cc, PdfChunk[] ck) 
    { 
     char c = ck == null 
      ? cc[current] 
      : (char)ck[Math.Min(current, ck.Length - 1)] 
       .GetUnicodeEquivalent(cc[current]) 
     ; 
     return (c == ')'); 
    } 
} 

然后调用SetSplitCharacter()Chunk

string chunkText = "FirstName LastName (2016-01-13 11:13)"; 
Random random = new Random(); 
var font = new Font(Font.FontFamily.HELVETICA, 10, Font.BOLD); 
using (Document document = new Document()) 
{ 
    PdfWriter.GetInstance(document, stream); 
    document.Open(); 
    Phrase phrase = new Phrase(); 
    for (var i = 0; i < 1000; ++i) 
    { 
     var asterisk = new String('*', random.Next(1, 20)); 
     Chunk chunk = new Chunk(
      string.Format("[{0}] {1}", asterisk, chunkText), 
      font 
     ); 
     chunk.SetSplitCharacter(new CustomSplitCharacter()); 
     phrase.Add(chunk); 
    } 

    document.Add(phrase); 
} 

这假设你的Chunk)结尾,就像你的示例代码,或者你有co在Chunk的文字的最后一个字符。

不依赖于特定的字体。 :)

enter image description here