Aspose.Pdf.Document 載入 Big5 Html 檔,存成 PDF 時,有些字會變成一個空的框框

您好,
我使用 Aspose.Pdf v 19.9 版本,
透過以下的程式,將 Html 檔案存成 pdf 檔案,會發生「查」這個字變成空白的框框。程式如下,產生的 PDF 及測試檔案在附件中。謝謝您。

var loadOptions = new Aspose.Pdf.HtmlLoadOptions();
var htmlFile = @"c:\test\20190911.html";
var pdfDoc = new Aspose.Pdf.Document(htmlFile, loadOptions);
pdfDoc.Save("pdfDoc_html2pdf.pdf");

20190911.zip (105.6 KB)

@rainmaker_ho

感谢您与支持人员联系。

我们使用Aspose.PDF for .NET 19.9生成了附加文档。 请您分享截图作为问题的比较。pdfDoc_19.9.pdf

var loadOptions = new Aspose.Pdf.HtmlLoadOptions(dataDir);
var htmlFile = dataDir + @"20190911.html";
var pdfDoc = new Aspose.Pdf.Document(htmlFile, loadOptions);
pdfDoc.Save(dataDir + "pdfDoc_19.9.pdf");

您好,
我是將Exe程式拿到 window 2008,2012 server上執行,會有缺字的狀況哦

@rainmaker_ho

谢谢你的详细信息。

问题很可能与丢失字体有关。 您可以将附加的字体复制到文件夹,然后使用下面的代码片段然后执行转换。

// connect custom font directory
FolderFontSource fs = new FolderFontSource(@"path\to\my\folder");
FontRepository.Sources.Add(fs);

Fonts.zip

您好,
我發現 FontRepository.Sources 原本就有包含預設的 C:\Windows\Fonts 目錄。

我使用以下的html,
<HTML><head><title>FC21900000-102/06/18 10:54:19</title><meta http-equiv="Content-Type" content="text/html; charset=big5" /></head>
<BODY>
查詢查日期
<hr>
查詢日期: 102/06/18 10:54:19
一、個
</BODY></HTML>

並使用 TextFragmentAbsorber 取出每段的字型會發現,
var absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
pdfDoc.Pages.Accept(absorber);
foreach (TextFragment textFragment in absorber.TextFragments)
{
Console.WriteLine("{0}:{1}", textFragment.Text, textFragment.TextState.Font.FontName);
}

預設的字型為 MSGothic ,output的內容為,
詢 日期:MSGothic
詢日期:MSGothic
::TimesNewRoman
102/06/18:TimesNewRoman
10:54:19:TimesNewRoman
一、個:MSGothic

所以我在 html 中加入 font 的設定,如下,
<HTML><head><title>FC21900000-102/06/18 10:54:19</title><meta http-equiv="Content-Type" content="text/html; charset=big5" /></head>
<BODY>
<basefont=4 font FACE="細明體" LANG="ZH-TW"><font face="細明體"><pre>
查詢查日期
<hr>
查詢日期: 102/06/18 10:54:19
一、個
</pre></font></basefont>
</BODY></HTML>

它的輸出為,
查詢查日期:DFKai-SB
查詢日期:DFKai-SB
::CourierNew
102/06/18:CourierNew
10:54:19:CourierNew
一:DFKai-SB
、:MSGothic
個:DFKai-SB

然後我將程式拿到 Windows Server 上測試,發現它的輸出為,
詢 日期:MSGothic
詢日期:MSGothic
::CourierNew
102/06/18:CourierNew
10:54:19:CourierNew
一:MSGothic
、:MSGothic
個:MSGothic

測試發現,當設定預設的字型後,在開發機上面(有安裝 VS.NET),會使用中文字型來代替,但在 Windows Server 上面執行,預設的字型卻還是 MSGothic 。
請問是否有方式設定 Aspose.PDF 使用的預設字型呢?
謝謝您的幫忙。

@rainmaker_ho

请注意,每个TextFragment都包含一个或多个TextSegments。 您可以在textsegment.TextEditOptions中指定ReplacementFont属性。 在指定的TextState.Font无法显示段文本的情况下,将使用指定的字体(如果可访问)。

segment.TextEditOptions = new TextEditOptions(TextEditOptions.NoCharacterAction.UseCustomReplacementFont)
{
    ReplacementFont = FontRepository.FindFont("name")
};

你好,請問此代碼寫在new document 之前嗎?
還是New document後,取出所有的segment 進行設定呢?謝謝您的幫忙

@rainmaker_ho

该代码可以与上述共享代码段结合使用:

var absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
pdfDoc.Pages.Accept(absorber);
foreach (TextFragment textFragment in absorber.TextFragments)
{
    Console.WriteLine("{0}:{1}", textFragment.Text, textFragment.TextState.Font.FontName);
    foreach(TextSegment segment in textFragment.Segments)
    {
        segment.TextEditOptions = new TextEditOptions(TextEditOptions.NoCharacterAction.UseCustomReplacementFont)
        {
            ReplacementFont = FontRepository.FindFont("name")
        };
    }
}

如果仍然遇到问题,请与屏幕截图共享您生成的文件,以便我们进一步调查。

您好,
感謝您熱心的幫忙,
我將程式改成在 載入 Html 後,先存檔一次(pdfDoc_html2pdf.pdf),再去調整 PDF 的內容,再另存到另一個 PDF (pdfDoc_html2pdf-2.pdf),結果那個「查」這個字,還是一個白的框框哦! 測試的html及產出的pdf檔如附件,程式如下,

static void Html2PDF()
{
	var dffont = FontRepository.FindFont("DFKai-SB");
	var loadOptions = new Aspose.Pdf.HtmlLoadOptions();
	var htmlFile = @"20190911.html";
	//請問有辦法在載入檔案時,就預設它的字型為 DFKai-SB 嗎?
	var pdfDoc = new Aspose.Pdf.Document(htmlFile, loadOptions);
	pdfDoc.FontSubstitution += PdfDoc_FontSubstitution;
	var saveOptions = new Aspose.Pdf.PdfSaveOptions();
	var html = new HtmlFragment("查詢查日期")
	{
		TextState = new TextState
		{
			//Font = dffont
		}
	}; 
	pdfDoc.Pages[1].Paragraphs.Add(html);
	pdfDoc.Save("pdfDoc_html2pdf.pdf", saveOptions);
	 
	var fonts = pdfDoc.FontUtilities.GetAllFonts();
	foreach (Aspose.Pdf.Text.Font font in fonts)
	{
		Console.WriteLine(font.FontName);
	}
	var absorber = new TextFragmentAbsorber(new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
	pdfDoc.Pages.Accept(absorber);
	foreach (TextFragment textFragment in absorber.TextFragments)
	{
		Console.WriteLine("{0}:{1}", textFragment.Text, textFragment.TextState.Font.FontName);
		foreach (TextSegment segment in textFragment.Segments)
		{
			segment.TextEditOptions = new TextEditOptions(TextEditOptions.NoCharacterAction.UseCustomReplacementFont)
			{
				ReplacementFont = dffont
			};
		}
	}
	pdfDoc.Save("pdfDoc_html2pdf-2.pdf");
}

asposeHtmlPDF.zip (247.7 KB)

您好,
我目前使用以下的方式,產出 pdf 不會有 白框或是中文全型字出不來的狀況,但如果有更簡單的做法,請再讓我知道,因為目前我的 html 檔是 big5 而且 html 檔有設定。
用這種方式,我還需要將 html 文字中的big5 置換成 utf8 ,程式碼如下,

var htmlFile = @"20190911.html";
var htmlContents = File.ReadAllText(htmlFile, System.Text.Encoding.GetEncoding(950));
htmlContents = htmlContents.Replace("big5", "utf8");
var dffont = FontRepository.FindFont("DFKai-SB");
var pdf = new Aspose.Pdf.Document();
var page = pdf.Pages.Add();
page.PageInfo.Height = Aspose.Pdf.PageSize.A4.Height;
page.PageInfo.Width = Aspose.Pdf.PageSize.A4.Width;
page.PageInfo.Margin.Left = 5;
page.PageInfo.Margin.Right = 5;
var html = new HtmlFragment(htmlContents)
{
	TextState = new TextState
	{
		Font = dffont
	}
};
page.Paragraphs.Add(html);
pdf.Save("html2pdf4.pdf");

感謝您的幫忙,期待您的回覆。

@rainmaker_ho

您还可以共享DFKai-SB字体的.ttf文件吗?

还要验证您是否尝试如上所述使用FontRepository.Sources.Add(fs)添加包含此字体的文件夹。

然后,我们将继续为您提供帮助。

您好,
附件(kaiu.zip) 為 標楷體的字型 kaiu.ttf ,它在繁體Windows作業系統中跟細明體一樣,都是內建的字型,所以它不需要再特別透過 FontRepository.Sources.Add 去加入 Font的Source。
當使用 Aspose.PDF.Document 直接載入 Html 檔案時,似乎會給一個預設的字型(MSGothic),只是我找不到在那個時機點去指定這個值為 DFKai-SB 。

請問 Aspose.PDF.Document 在載入 Html 檔時,它的預設字型是如何決定的呢?
有機會可以改變預設字型嗎?
謝謝您的幫忙。

kaiu.zip (2.7 MB)

@rainmaker_ho

HtmlSaveOptions类公开DefaultFontName属性,而HtmlLoadOptions类不公开。 因此,我们已在问题管理系统中记录了具有ID PDFNET-47018的票证,以进行进一步调查。 一旦有任何有关此方面的更新,我们将通知您。

1 Like

您好,
那目前除了用 HtmlFragment 方式,是否可透過 Reflection 的方式來設定 DefaultFont 呢?
謝謝您。

@rainmaker_ho

我们已使用以下代码通过HtmlFragment设置字体,请尝试一下,然后分享您的反馈。

Aspose.Pdf.Text.Font myFont = Aspose.Pdf.Text.FontRepository.OpenFont(@"D:\kaiu\kaiu.ttf");
myFont.IsSubset = false;
myFont.IsEmbedded = true;
HtmlFragment htmlFragment = new HtmlFragment(System.IO.File.ReadAllText(dataDir + "20190911.html"));
htmlFragment.TextState = new TextState();
htmlFragment.TextState.Font = myFont;
Document doc = new Document();
doc.Pages.Add().Paragraphs.Add(htmlFragment);
doc.Save(dataDir + "HtmlFragment_19.9.pdf");