C# 使用GDI+打印阿拉伯字符;使用Microsoft XPS Document Writer产生置乱输出

C# 使用GDI+打印阿拉伯字符;使用Microsoft XPS Document Writer产生置乱输出,c#,winforms,printing,gdi+,arabic-support,C#,Winforms,Printing,Gdi+,Arabic Support,我需要使用GDI+方法来打印阿拉伯语字符,我遇到了一些似乎与特定打印机相关的问题 这是我在Windows应用程序中使用的方法: g.DrawString("اللائحة (EC) رقم 648/2004 (المنظفات)", new Font("Arial Unicode MS", 5), Brushes.Black, rectangle, new StringFormat(StringFormatFlags.DirectionRightToLeft)); g是打印机图形对象,矩形是打

我需要使用GDI+方法来打印阿拉伯语字符,我遇到了一些似乎与特定打印机相关的问题

这是我在Windows应用程序中使用的方法:

g.DrawString("اللائحة (EC) رقم 648/2004 (المنظفات)", new Font("Arial Unicode MS", 5), Brushes.Black, rectangle, new StringFormat(StringFormatFlags.DirectionRightToLeft));
g是打印机图形对象,矩形是打印区域

我正在Windows 10中尝试使用默认安装的打印机Microsoft Print to PDFMicrosoft XPS Document Writer

这是Microsoft Print to PDF的正确输出:

这是Microsoft XPS Document Writer的输出:

正如你所看到的,所有的角色都被置乱了


你知道为什么会这样吗?是否可以使用GDI+向所有打印机正确打印阿拉伯字符?

这与Graphics.DrawString()或XPS document writer无关。这很可能是XPS查看器的问题。阿拉伯语和拉丁语字形和标点符号的混合很少是问题,考虑给予文本渲染器明确的提示。我已经传入了
StringFormatFlags.DirectionRightToLeft
,它似乎适用于除XPS one之外的所有打印机。我的程序正在使用XPS Document Writer制作文档的默认预览,因此我需要让它工作……如果没有可靠地重现问题的良好工具,就不可能重现,更不用说解决您的问题了。也就是说,看起来您可能没有考虑从右向左与从左向右的字符。它们将在您的代码编辑器中从左到右显示,但在实际渲染过程中从右到左的脚本处理正确,因此如果您不考虑这一点,可能会重叠从左到右的脚本。@PeterDuniho我可以确认这个问题。使用Microsoft Print to PDF可以正确打印复杂文本(包含英文和阿拉伯文字母),也可以在“打印预览”对话框中正确查看结果,但使用Microsoft XPS Document Writer无法正确打印结果。虽然代码不是MCVE的一个好例子,但它可以帮助您简单地重现问题。对于那些可能对问题有一些想法的人,我将分享以下两个观察结果:1)如果您使用
TextRenderer.DrawText
,您可以正确获得结果。但从Windows窗体打印时不支持它。相反,请使用Graphics类的DrawString方法。2) 问题似乎更多地与XPS Viewer有关,因为如果将相同的乱七八糟的XPS fale打印到PDF打印机上,您会在PDF中看到正确的结果。这可能与Graphics.DrawString()或XPS文档编写器无关。这很可能是XPS查看器的问题。阿拉伯语和拉丁语字形和标点符号的混合很少是问题,考虑给予文本渲染器明确的提示。我已经传入了
StringFormatFlags.DirectionRightToLeft
,它似乎适用于除XPS one之外的所有打印机。我的程序正在使用XPS Document Writer制作文档的默认预览,因此我需要让它工作……如果没有可靠地重现问题的良好工具,就不可能重现,更不用说解决您的问题了。也就是说,看起来您可能没有考虑从右向左与从左向右的字符。它们将在您的代码编辑器中从左到右显示,但在实际渲染过程中从右到左的脚本处理正确,因此如果您不考虑这一点,可能会重叠从左到右的脚本。@PeterDuniho我可以确认这个问题。使用Microsoft Print to PDF可以正确打印复杂文本(包含英文和阿拉伯文字母),也可以在“打印预览”对话框中正确查看结果,但使用Microsoft XPS Document Writer无法正确打印结果。虽然代码不是MCVE的一个好例子,但它可以帮助您简单地重现问题。对于那些可能对问题有一些想法的人,我将分享以下两个观察结果:1)如果您使用
TextRenderer.DrawText
,您可以正确获得结果。但从Windows窗体打印时不支持它。相反,请使用Graphics类的DrawString方法。2) 问题似乎更多地与XPS Viewer有关,因为如果您将相同的杂乱XPS fale打印到PDF打印机上,您会看到PDF中的结果是正确的。