[英]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();
});
}
我問這個問題的原因是因為在英語中它工作得很好,但它只是省略了希伯來字母,這很有趣——我認為它會用奇怪的字符代替它。
所以我終於設法解決了這個問題。
問題不在於我缺少一種字體,而是我根本沒有向new Phrase
function 發送一個字體。
我想它知道如何處理英文字母,但不知道如何處理希伯來文字母。
我所做的是這樣的:
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!
如果您想避免由於 memory 碎片導致的 OutOfMemory 問題,請使用 RecyclableMemoryStream。
https://www.philosophicalgeek.com/2015/02/06/announcing-microsoft-io-recycablememorystream/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.