Convert Hard hyphens to soft hyphens so that the PDF can be searched for hyphens.
Use the ISplitCharacter Interface to treat soft hyphens as non-breaking hyphens (only word wrap on spaces)
This commit is contained in:
parent
93043d7fd4
commit
ad300e777a
@ -236,6 +236,7 @@ namespace Volian.Print.Library
|
|||||||
myPara.MultipliedLeading = 12.0f / myPara.TotalLeading;
|
myPara.MultipliedLeading = 12.0f / myPara.TotalLeading;
|
||||||
|
|
||||||
myPara.SpacingAfter = 8; // RHM 20120925 - Add a line to properly space text from lines.
|
myPara.SpacingAfter = 8; // RHM 20120925 - Add a line to properly space text from lines.
|
||||||
|
FixHyphens(myPara);
|
||||||
myColumnText1.AddElement(myPara);
|
myColumnText1.AddElement(myPara);
|
||||||
//myColumnText1.Canvas.SetColorFill(PrintOverride.OverrideTextColor(System.Drawing.Color.Black));
|
//myColumnText1.Canvas.SetColorFill(PrintOverride.OverrideTextColor(System.Drawing.Color.Black));
|
||||||
float posBefore = myColumnText1.YLine;
|
float posBefore = myColumnText1.YLine;
|
||||||
@ -249,6 +250,75 @@ namespace Volian.Print.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public class VlnSplitCharacter : ISplitCharacter
|
||||||
|
{
|
||||||
|
public bool IsSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck)
|
||||||
|
{
|
||||||
|
return (cc[current] == ' ');
|
||||||
|
}
|
||||||
|
public bool IsSplitCharacter(char c)
|
||||||
|
{
|
||||||
|
return (c == ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static VlnSplitCharacter mySplitter = new VlnSplitCharacter();
|
||||||
|
internal static void FixHyphens(Paragraph myPara)
|
||||||
|
{
|
||||||
|
// Find chunk with hardhyphen
|
||||||
|
int hype=-1;
|
||||||
|
Font fnt = null;
|
||||||
|
foreach (Chunk chk in myPara)
|
||||||
|
{
|
||||||
|
fnt = chk.Font;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while ((hype = GetHyphen(myPara)) > -1)
|
||||||
|
{
|
||||||
|
Chunk chk = (Chunk)myPara[hype];
|
||||||
|
string prefix = "";
|
||||||
|
if (chk.Content == "\u2011" && hype < (myPara.Count - 1))
|
||||||
|
{
|
||||||
|
myPara.RemoveAt(hype);// Remove standalone hyphen
|
||||||
|
chk = (Chunk)myPara[hype];
|
||||||
|
prefix = "-";
|
||||||
|
}
|
||||||
|
myPara.RemoveAt(hype);
|
||||||
|
myPara.Insert(hype, new Chunk(prefix + chk.Content.Replace("\u2011", "-"), fnt));
|
||||||
|
}
|
||||||
|
//bool hasXXX = false;
|
||||||
|
//foreach (Chunk chk in myPara)
|
||||||
|
//{
|
||||||
|
// if(hasXXX)
|
||||||
|
// Console.WriteLine("0,\"{0}\"\t\"{1}\"", chk.Content, chk.Font.Familyname);
|
||||||
|
// else if (chk.Content.Contains("xxx"))
|
||||||
|
// {
|
||||||
|
// hasXXX = true;
|
||||||
|
// Console.WriteLine("1,\"{0}\"\t\"{1}\"", chk.Content, chk.Font.Familyname);
|
||||||
|
// }
|
||||||
|
// else if (chk.Content.Contains("zzz")) Console.WriteLine("3,\"{0}\"\t\"{1}\"", chk.Content, chk.Font.Familyname);
|
||||||
|
// else if (chk.Content.Contains("\u2011")) Console.WriteLine("2\"{0}\"\t\"{1}\"", chk.Content, chk.Font.Familyname);
|
||||||
|
// if (chk.Attributes == null || !chk.Attributes.ContainsKey("NoSplit"))
|
||||||
|
// {
|
||||||
|
// if (chk.Attributes == null) chk.Attributes = new System.Collections.Hashtable();
|
||||||
|
// //Console.WriteLine("Oops!");
|
||||||
|
// chk.SetSplitCharacter(mySplitter);
|
||||||
|
// chk.Attributes.Add("NoSplit", false);
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
private static int GetHyphen(Paragraph myPara)
|
||||||
|
{
|
||||||
|
int index=0;
|
||||||
|
foreach (Chunk chk in myPara.Chunks)
|
||||||
|
if (chk.Content.Contains("\u2011"))
|
||||||
|
return index;
|
||||||
|
else
|
||||||
|
index++;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
public static float CalculateHangingIndent(string rtf)
|
public static float CalculateHangingIndent(string rtf)
|
||||||
{
|
{
|
||||||
float chkW = 0;
|
float chkW = 0;
|
||||||
@ -666,6 +736,7 @@ namespace Volian.Print.Library
|
|||||||
float adjustTextLocation = mult * 4; // RHM 20120925 Move text down about 1 half line from the border
|
float adjustTextLocation = mult * 4; // RHM 20120925 Move text down about 1 half line from the border
|
||||||
myColumnText1.SetSimpleColumn(1 + left + x, top - y - h , left + x + w, 1 + top - y - hAdjust - adjustTextLocation); // 2 == Default Padding
|
myColumnText1.SetSimpleColumn(1 + left + x, top - y - h , left + x + w, 1 + top - y - hAdjust - adjustTextLocation); // 2 == Default Padding
|
||||||
MyPara.MultipliedLeading *= _MyPageHelper.YMultiplier;
|
MyPara.MultipliedLeading *= _MyPageHelper.YMultiplier;
|
||||||
|
vlnCells.FixHyphens(MyPara);
|
||||||
myColumnText1.AddElement(MyPara);
|
myColumnText1.AddElement(MyPara);
|
||||||
myColumnText1.Go();
|
myColumnText1.Go();
|
||||||
myColumnText.Canvas.RestoreState();
|
myColumnText.Canvas.RestoreState();
|
||||||
|
@ -104,7 +104,14 @@ namespace Volian.Print.Library
|
|||||||
{
|
{
|
||||||
// Change the chunks to only split on spaces rather than spaces and hyphens
|
// Change the chunks to only split on spaces rather than spaces and hyphens
|
||||||
foreach (Chunk chk in iParagraph)
|
foreach (Chunk chk in iParagraph)
|
||||||
chk.SetSplitCharacter(mySplitter);
|
{
|
||||||
|
if (chk.Attributes == null || !chk.Attributes.ContainsKey("NoSplit"))
|
||||||
|
{
|
||||||
|
if (chk.Attributes == null) chk.Attributes = new System.Collections.Hashtable();
|
||||||
|
chk.SetSplitCharacter(mySplitter);
|
||||||
|
chk.Attributes.Add("NoSplit", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
VlnSvgPageHelper _MyPageHelper = cb.PdfWriter.PageEvent as VlnSvgPageHelper;
|
VlnSvgPageHelper _MyPageHelper = cb.PdfWriter.PageEvent as VlnSvgPageHelper;
|
||||||
PdfLayer textLayer = _MyPageHelper == null ? null : _MyPageHelper.TextLayer;
|
PdfLayer textLayer = _MyPageHelper == null ? null : _MyPageHelper.TextLayer;
|
||||||
float left = x + Offset.X;
|
float left = x + Offset.X;
|
||||||
|
@ -84,6 +84,18 @@ namespace Volian.Print.Library
|
|||||||
get { return _Rtf; }
|
get { return _Rtf; }
|
||||||
set { _Rtf = value; }
|
set { _Rtf = value; }
|
||||||
}
|
}
|
||||||
|
public class VlnSplitCharacter : ISplitCharacter
|
||||||
|
{
|
||||||
|
public bool IsSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck)
|
||||||
|
{
|
||||||
|
return (cc[current] == ' ');
|
||||||
|
}
|
||||||
|
public bool IsSplitCharacter(char c)
|
||||||
|
{
|
||||||
|
return (c == ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static VlnSplitCharacter mySplitter = new VlnSplitCharacter();
|
||||||
iTextSharp.text.Paragraph _IParagraph;
|
iTextSharp.text.Paragraph _IParagraph;
|
||||||
public iTextSharp.text.Paragraph IParagraph
|
public iTextSharp.text.Paragraph IParagraph
|
||||||
{
|
{
|
||||||
@ -112,7 +124,7 @@ namespace Volian.Print.Library
|
|||||||
get
|
get
|
||||||
{
|
{
|
||||||
int profileDepth = ProfileTimer.Push(">>>> vlnPrintObject.Height");
|
int profileDepth = ProfileTimer.Push(">>>> vlnPrintObject.Height");
|
||||||
if (_Height == 0)
|
if (_Height == 0)
|
||||||
_Height = GetParagraphHeight(MyContentByte, IParagraph, Width);
|
_Height = GetParagraphHeight(MyContentByte, IParagraph, Width);
|
||||||
ProfileTimer.Pop(profileDepth);
|
ProfileTimer.Pop(profileDepth);
|
||||||
return _Height;
|
return _Height;
|
||||||
@ -377,6 +389,16 @@ namespace Volian.Print.Library
|
|||||||
para.IndentationLeft = chkW;
|
para.IndentationLeft = chkW;
|
||||||
para.FirstLineIndent = -chkW;
|
para.FirstLineIndent = -chkW;
|
||||||
}
|
}
|
||||||
|
// Change the chunks to only split on spaces rather than spaces and hyphens
|
||||||
|
foreach (Chunk chk in para)
|
||||||
|
{
|
||||||
|
if (chk.Attributes==null || !chk.Attributes.ContainsKey("NoSplit"))
|
||||||
|
{
|
||||||
|
if (chk.Attributes == null) chk.Attributes = new System.Collections.Hashtable();
|
||||||
|
chk.SetSplitCharacter(mySplitter);
|
||||||
|
chk.Attributes.Add("NoSplit", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
return para;
|
return para;
|
||||||
}
|
}
|
||||||
public static float CalculateHangingIndent(string rtf)
|
public static float CalculateHangingIndent(string rtf)
|
||||||
|
@ -682,11 +682,17 @@ namespace Volian.Svg.Library
|
|||||||
ColumnText ct = new ColumnText(cb);
|
ColumnText ct = new ColumnText(cb);
|
||||||
float x = (myParent is SvgGroup && (myParent as SvgGroup).Description.ToUpper() == "ABSOLUTE") ? scale.AbsX(X): scale.X(X);
|
float x = (myParent is SvgGroup && (myParent as SvgGroup).Description.ToUpper() == "ABSOLUTE") ? scale.AbsX(X): scale.X(X);
|
||||||
float w = 0; // chk.GetWidthPoint();
|
float w = 0; // chk.GetWidthPoint();
|
||||||
|
// Change the chunks to only split on spaces rather than spaces and hyphens
|
||||||
foreach (Chunk chk in ph.Chunks)
|
foreach (Chunk chk in ph.Chunks)
|
||||||
{
|
{
|
||||||
w += chk.GetWidthPoint();
|
w += chk.GetWidthPoint();
|
||||||
// Change the chunks to only split on spaces rather than spaces and hyphens
|
// Change the chunks to only split on spaces rather than spaces and hyphens
|
||||||
chk.SetSplitCharacter(mySplitter);
|
if (chk.Attributes == null || !chk.Attributes.ContainsKey("NoSplit"))
|
||||||
|
{
|
||||||
|
if (chk.Attributes == null) chk.Attributes = new Hashtable();
|
||||||
|
chk.SetSplitCharacter(mySplitter);
|
||||||
|
chk.Attributes.Add("NoSplit", false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
switch (Justify)
|
switch (Justify)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user