我正在使用 PdfSharp 创建一些 pdf 文件。一切正常,除非我尝试使用 Drawstring 方法以从右到左的语言(例如波斯语)将一些文本放入文件中。虽然我在 XPdfFontOptions 中选择了 Unicode 编码和合适的字体系列(例如,“B Nazanin”),但它会离散地绘制字母。
这是我得到的图像。
顺便说一句,有没有更好的方法来创建 pdf 文件?
我正在使用 PdfSharp 创建一些 pdf 文件。一切正常,除非我尝试使用 Drawstring 方法以从右到左的语言(例如波斯语)将一些文本放入文件中。虽然我在 XPdfFontOptions 中选择了 Unicode 编码和合适的字体系列(例如,“B Nazanin”),但它会离散地绘制字母。
这是我得到的图像。
顺便说一句,有没有更好的方法来创建 pdf 文件?
iTextSharp 是 RTL 语言的更好选择。您可以在此处找到有关它的教程。
您需要反转字母,然后反转整个字符串。我自己需要它,所以它经过测试和工作:
public static string ReverseString(this string str)
{
StringBuilder sb = new StringBuilder();
foreach (char c in str.Reverse())
{
sb.Append(c);
}
return sb.ToString();
}
public static string RightToLeft(this string str)
{
List<string> output = str.Split(' ').Select(s => s.Any(c => c >= 1424 && c <= 1535) ? s.ReverseString() : s).ToList();
output.Reverse();
return string.Join(" ", output.ToArray());
}
private void DrawStringBoxRightToLeft(XGraphics gfx, string text, XFont font, XBrush brush, XRect rect)
{
List<string> words = text.Split(' ').ToList();
List<string> sentences = new List<string>();
while (words.Any())
{
while (gfx.MeasureString(string.Join(" ", sentences), font).Width < rect.Width && words.Any())
{
string s = words[0];
sentences.Add(s);
words.RemoveAt(0);
}
gfx.DrawString(string.Join(" ", sentences).RightToLeft(), font, brush, rect, XStringFormats.TopRight);
rect.Y += font.Height;
sentences.Clear();
}
}
PDFsharp (尚)不支持从右到左的语言。