您好,
我使用 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");