c# - 如何使用 MigraDoc 编写阿拉伯语文本?
问题描述
我为此使用 ASP,我必须生成 PDF 格式的报告并将文件发送回客户,以便他们下载。
我使用 MigraDoc 库制作了报告,它们很棒,但是在我尝试使用阿拉伯语文本后,我发现文本在 LTR 中并且字符脱节,所以我编写了这段代码来测试一下
...............
MigraDoc.DocumentObjectModel.Document reportDoc = new MigraDoc.DocumentObjectModel.Document();
reportDoc.Info.Title = "test";
sec = reportDoc.AddSection();
string fileName = "test.pdf";
addformattedText(sec, "العبارة", true);
PdfDocumentRenderer renderer = new PdfDocumentRenderer(true);
renderer.Document = reportDoc;
renderer.RenderDocument();
MemoryStream pdfStream = new MemoryStream();
renderer.PdfDocument.Save(pdfStream);
byte[] bytes = pdfStream.ToArray();
...............
private void addformattedText(Section sec,string text, bool shouldBeBold = false)
{
var tf = sec.AddTextFrame();
var p = tf.AddParagraph(text);
p.Format.Font.Name = "Tahoma";
if (shouldBeBold) p.Format.Font.Bold = true;
}
我尝试使用此代码对文本进行编码并使其成为 unicode 字符串
private string getEscapedString(string text)
{
if (true || HasArabicCharacters(text))
{
string uString = "";
byte[] utfBytes = Encoding.Unicode.GetBytes(text);
foreach (var u in utfBytes)
{
if (u != 0)
{
uString += String.Format(@"\u{0:x4}", u);
}
}
return uString;
}
else
return text;
}
并将返回的字符串放入一个段落中,并将 unicode 参数设置为 true 的 PDF 文档保存
但这都是一样的。
我不知道如何完成它。
报告是使用 MigraDoc 1.50.5147 库完成的。
解决方案
问题是阿拉伯语字体在乞求、最后、连接和单独时有 4 种不同的形状,其中 Pdfsharp 和 MigraDoc 无法识别要打印的更远的形状,您需要反转字符顺序来解决这个问题,您可以使用AraibcPdfUnicodeGlyphsResharper来帮助做到这一点工作如下:
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using AraibcPdfUnicodeGlyphsResharper;
namespace MigraDocArabic
{
internal class PrintArabicUsingPdfSharp
{
public PrintArabicUsingPdfSharp(string path)
{
PdfDocument document = new PdfDocument();
document.Info.Title = "Created with PDFsharp";
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
// Create an empty page
PdfPage page = document.AddPage();
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);
// Create a font
XFont font = new XFont("Arial", 20, XFontStyle.BoldItalic);
var xArabicString = "كتابة اللغة العربية شيئ جميل".ArabicWithFontGlyphsToPfd();
// Draw the text
gfx.DrawString("Hello, World!", font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), XStringFormats.Center);
gfx.DrawString(xArabicString, font, XBrushes.Black, new XRect(50, 50, page.Width, page.Height), XStringFormats.Center);
// Save the document...
document.Save(path);
}
}
}
不要忘记扩展方法顺便说一句,这也适用于 iText7,也可以查看图像以获取结果
推荐阅读
- spring-boot - REST API - 使用 ID 列表删除
- javascript - Expo“yarn androd”命令在加载 javascript 包后未加载 App.js
- python - Python双双引号没有被替换
- flutter - 如何以编程方式打开键盘文本字段
- python - 布尔索引器脚本没有错误但不起作用
- javascript - 通过 Node.js 托管本地服务器未按预期工作
- php - 太多时PHP关闭连接
- angular - Stripe V3 RedirectToCheckout 定义
- r - 沿着数组的多个维度优化 which.max
- vagrant - 如何将 vagrant 用于 Oracle 云基础架构