itext中自定义字体的千位分隔符呈现错误



自从我使用自定义字体升级到iText 7.2(从7.1.7开始(以来,我遇到了渲染问题。

千分隔符未正确呈现。

使用iText 7.1.7

使用iText 7.2

tableArticles.AddCell(new Cell(1, 2)
.Add(new Paragraph($"{bonCommande.Total:C}")
.SetFontSize(14)
.SetBold()
.SetTextAlignment(TextAlignment.RIGHT)
.SetFixedLeading(LeadingSize))
.SetBorder(new SolidBorder(1))
.SetVerticalAlignment(VerticalAlignment.MIDDLE)
.SetPadding(5));

我试图通过为unicode char arabic数千分隔符(U+066C(绘制一些东西来更新字体,但没有成功。

我来自比利时,使用";fr BE";。

谢谢你的帮助。

编辑:下面是一些带有字体和pdf示例的代码示例。WeTransfer PDF和字体链接

public class PdfCurrencyModel : PageModel
{
private readonly IPdfCurrencyService _pdfCurrencyService;
public PdfCurrencyModel(IPdfCurrencyService pdfCurrencyService)
{
_pdfCurrencyService = pdfCurrencyService;
}
public IActionResult OnGetAsync()
{
//var stream =  _pdfCurrencyService.GetPDFMemoryStream();
//return File(stream, MediaTypeNames.Application.Pdf, "Values.pdf");
var bytesArray =  _pdfCurrencyService.GetPDFBytesArray();
return new FileContentResult(bytesArray, MediaTypeNames.Application.Pdf);
}
}
public interface IPdfCurrencyService
{
public MemoryStream GetPDFMemoryStream();
public byte[] GetPDFBytesArray();
}
public class PdfCurrencyService : IPdfCurrencyService
{
public MemoryStream GetPDFMemoryStream()
{
// Fonts
var fontTexte = PdfFontFactory.CreateFont(FontConstants.BrownBold,
PdfFontFactory.EmbeddingStrategy.FORCE_EMBEDDED);
// Initialisation
var ms = new MemoryStream();
// Initialize PDF writer
var writer = new iText.Kernel.Pdf.PdfWriter(ms);
writer.SetCloseStream(false);
// Initialize PDF document
var pdfDoc = new iText.Kernel.Pdf.PdfDocument(writer);
// Initialize document
var document = new Document(pdfDoc, iText.Kernel.Geom.PageSize.A4)
.SetFont(fontTexte).SetFontSize(10);
// Values
for (var i = 1000; i <= 2000; i += 100)
document.Add(new Paragraph(i.ToString("C")));
// Close document
document.Close();
//ms.Flush();
ms.Position = 0;
return ms;
}
public byte[] GetPDFBytesArray()
{
return GetPDFMemoryStream().ToArray();
}
}

编辑2:我创建了一个有问题的简单web应用程序链接到项目

当使用"fr-BE";培养这条线:

1000.ToString("C")

评估为:

1.000,00 €

iText似乎对"进行了一些处理"(点(,因为这两个文件都不正确。

7.2.1似乎改变了字体的处理方式。7.1.7创建了一个简单的WinAnsi字体,而7.2.1创建了一种Type0字体。

7.1.7在PDF文件中根本不写点:

BT
/F1 10 Tf
36 787.93 Td
(1000,00 €)Tj
ET

7.2.1写入<0000>对于PDF文件中的点GID(而不是<0073>((我在字符串中添加空格以强调每个GID(:

BT
/F1 10 Tf
36 787.93 Td
<0093 0000 00a2 00a2 00a2 0080 00a2 00a2 0074 00e1>Tj
ET

我终于设法让它工作起来了。在7.2.x版本中,iText似乎使用U+202F(窄无空格(作为千分隔符,但以前不是这样。

我的字体没有指定内容,所以它呈现为正方形。我从U+0020复制/粘贴;SPACE";我不再有任何问题了。

在fr-BE和fr-fr中,千分隔符是一个空格,而不是一个点。

var separator = new CultureInfo("fr-BE", false)
.NumberFormat
.CurrencyGroupSeparator;
Debug.WriteLine($"Currency Group Separator for fr-BE is {(int)separator[0]}");
Debug.WriteLine($"As HEX {((int)separator[0]).ToString("X")}");
// Currency Group Separator for fr-BE is 8239
//As HEX 202F

感谢大家抽出时间。

最新更新