2016-01-13 298 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