* .emlファイルから取得したHTMLを使用してpdfファイルを作成する小さなC#デスクトップアプリケーションがあります。HTMLからpdfへの変換で例外が発生する
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div style="font: normal 13px Arial; color:#000000;">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><font face="Calibri">Some text<o:p></o:p></font></font><br />
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><o:p><font size="3" face="Calibri"> </font></o:p><br />
<span style="FONT-SIZE: 11pt; FONT-FAMILY: "Calibri","sans-serif"; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-fareast-language: EN-US; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-bidi; mso-ansi-language: IT; mso-bidi-language: AR-SA">Some other text</span>
</p>
</div>
</body>
</html>
すべてが、私はクライアントのマシン(ウィンサーバー2008 R2 x64)の上で同じコードを実行したときしかし、私は「文書があり得る、私のマシン(Win10 x64)の上だけで正常に動作:ここで はサンプルですiTextSharp例外からの「ページなし」メッセージです。
これは、今投稿したばかりの特定のHTML文字列の場合にのみ発生します。クライアントのマシン上でデバッグセッションを実行することはできませんが、HTMLアジャイルパックで解析されたように、プログラムが整形式のHTMLを受け取ることを確認しました。
これはフォント関連の問題ですか?私は絶対に手がかりがない、これらはクライアントのマシン上に存在するようです。ここで
は、(任意の与えられたスニペットに存在しないので、それは問題ではありませんけれども、それは、カスタムイメージタグのプロセッサを使用しています)私は、PDF文書を作成するために使用するコードの抜粋です:
using (var document = new Document())
{
var writer = PdfWriter.GetInstance(document, new FileStream(destinationPath, FileMode.Create));
writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
document.Open();
var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
tagProcessors.RemoveProcessor(HTML.Tag.IMG);
tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor());
CssFilesImpl cssFiles = new CssFilesImpl();
cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
var cssResolver = new StyleAttrCSSResolver(cssFiles);
cssResolver.AddCss(@"code { padding: 2px 4px; }", "utf-8", true);
var charset = Encoding.UTF8;
var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors);
var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, writer));
var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
var worker = new XMLWorker(pipeline, true);
var xmlParser = new XMLParser(true, worker, charset);
xmlParser.Parse(new StringReader(fixedMarkup));
}
提案していただきありがとうございます、私はこれがより良い解決策であるかどうかを確認するための試用版ライセンスを取得しようとします。私はまだ2つのマシンで異なる動作の原因を特定したいと思います。 – mentre83
私は思うが(これは実際にコードを実行するよりも経験に基づいている)、おそらくフォントや他のリソースがあるコンピュータでは利用できないが、他のリソースでは何かをしなければならないだろう。たとえば、グリフがレンダリングできない場合(フォントにそのグリフがないため)、iTextは単にその文字をレンダリングしません。すべての文字がスキップされた場合、コンテンツは追加されず、「ドキュメントにはページがありません」という例外が発生します。また、Arialユニコードはすべてのマシンで使用できるわけではありません。 –
私の考えはまさに。グリフは問題ではないようですが、これはフォントと関係があると思われます。リソース面では、私がコードをテストするために使用したマシン(私もいくつかのVMでも試しました)はかなり同じようです。 – mentre83