已解决:C# MemoryStream 转换为字节数组,然后转换为 base64 字符串删除 RTL 字符
Solved: C# MemoryStream converted to byte array, then to base64 string removes RTL characters
我正在为 pdf 文件添加页码,
它可以正常使用英语,但是当我尝试添加希伯来语文本时,它忽略了这些字母。
我假设问题出在 base64 编码上,我该如何解决?
代码示例
byte[] myBinary = File.ReadAllBytes(path);
using (var reader = new PdfReader(myBinary))
{
using (var ms = new MemoryStream())
{
using (var stamper = new PdfStamper(reader, ms))
{
int PageCount = reader.NumberOfPages;
for (int i = 1; i <= PageCount; i++)
{
ColumnText.ShowTextAligned(stamper.GetUnderContent(i),
Element.ALIGN_CENTER, new Phrase(String.Format("{0} מתוך {1}", i, PageCount)), 297f, 15f, 0);
}
}
myBinary = ms.ToArray();
}
}
string base64EncodedPDF = System.Convert.ToBase64String(myBinary);
return base64EncodedPDF;
前面我只是下载文件。
$scope.open_letter = function (letter) {
var _letter = myService.PrintLetter().then(function (data) {
var pdfAsDataUri = "data:application/pdf;base64," + data.data;
var a = document.createElement("a");
a.href = pdfAsDataUri;
a.download = "מכתב" + ".pdf";
a.click();
});
}
我问这个问题的原因是因为在英语中它完美地工作,但它只是 ommits 希伯来字母,这很有趣 - 我假设它会用奇怪的字符。
所以我终于设法解决了这个问题。
问题不是我缺少字体,而是我根本没有将字体发送到 new Phrase
函数。
我猜它知道如何处理英文字母,但不知道如何处理希伯来文字母。
我做的是这样的:
BaseFont bf = BaseFont.CreateFont("c:/windows/Fonts/GISHA.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font f= new Font(bf, 8, Font.NORMAL, BaseColor.BLACK);
然后在我的页码循环中,我这样做了:
int PageCount = reader.NumberOfPages;
for (int i = 1; i <= PageCount; i++)
{
ColumnText.ShowTextAligned(stamper.GetUnderContent(i),
Element.ALIGN_CENTER, new Phrase(String.Format("{1} ךותמ {0}", i, PageCount), f), 297f, 15f, 0);
}
这解决了我的问题,现在效果很好。
给你的建议:不要使用 MemoryStream!
如果你想避免内存碎片导致的 OutOfMemory 问题,请使用 RecyclableMemoryStream。
https://www.philosophicalgeek.com/2015/02/06/announcing-microsoft-io-recycablememorystream/
Memorystream and Large Object Heap
我正在为 pdf 文件添加页码,
它可以正常使用英语,但是当我尝试添加希伯来语文本时,它忽略了这些字母。
我假设问题出在 base64 编码上,我该如何解决?
代码示例
byte[] myBinary = File.ReadAllBytes(path);
using (var reader = new PdfReader(myBinary))
{
using (var ms = new MemoryStream())
{
using (var stamper = new PdfStamper(reader, ms))
{
int PageCount = reader.NumberOfPages;
for (int i = 1; i <= PageCount; i++)
{
ColumnText.ShowTextAligned(stamper.GetUnderContent(i),
Element.ALIGN_CENTER, new Phrase(String.Format("{0} מתוך {1}", i, PageCount)), 297f, 15f, 0);
}
}
myBinary = ms.ToArray();
}
}
string base64EncodedPDF = System.Convert.ToBase64String(myBinary);
return base64EncodedPDF;
前面我只是下载文件。
$scope.open_letter = function (letter) {
var _letter = myService.PrintLetter().then(function (data) {
var pdfAsDataUri = "data:application/pdf;base64," + data.data;
var a = document.createElement("a");
a.href = pdfAsDataUri;
a.download = "מכתב" + ".pdf";
a.click();
});
}
我问这个问题的原因是因为在英语中它完美地工作,但它只是 ommits 希伯来字母,这很有趣 - 我假设它会用奇怪的字符。
所以我终于设法解决了这个问题。
问题不是我缺少字体,而是我根本没有将字体发送到 new Phrase
函数。
我猜它知道如何处理英文字母,但不知道如何处理希伯来文字母。
我做的是这样的:
BaseFont bf = BaseFont.CreateFont("c:/windows/Fonts/GISHA.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font f= new Font(bf, 8, Font.NORMAL, BaseColor.BLACK);
然后在我的页码循环中,我这样做了:
int PageCount = reader.NumberOfPages;
for (int i = 1; i <= PageCount; i++)
{
ColumnText.ShowTextAligned(stamper.GetUnderContent(i),
Element.ALIGN_CENTER, new Phrase(String.Format("{1} ךותמ {0}", i, PageCount), f), 297f, 15f, 0);
}
这解决了我的问题,现在效果很好。
给你的建议:不要使用 MemoryStream!
如果你想避免内存碎片导致的 OutOfMemory 问题,请使用 RecyclableMemoryStream。
https://www.philosophicalgeek.com/2015/02/06/announcing-microsoft-io-recycablememorystream/
Memorystream and Large Object Heap