2017-10-20 16 views
0

* .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">&nbsp;</font></o:p><br /> 
    <span style="FONT-SIZE: 11pt; FONT-FAMILY: &quot;Calibri&quot;,&quot;sans-serif&quot;; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &quot;Times New Roman&quot;; 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)); 
} 

答えて

1

は、問題を発見しました。私が思ったように、それはフォントに関連していました。

私のマシンでは、Calibriフォントは* .pdfドキュメントに埋め込まれ、他のマシンでは「フォント埋め込み可能性」プロパティが「制限付き」に設定されています。

私はHTMLを解析し、「フォントファミリ」タグ内のすべての値を制限されていないタグに変更する必要があると思います。

1

HTMLをPDFに変換するiText7(iTextの最新バージョン)アドオンであるpdfHTMLに移行する必要があります。 多くのバグ(テーブル、フォント、レイアウトに関連するバグ)は長年にわたって修正されていたので、デフォルトではpdfHTMLが変換を実行する可能性が高くなりました。

サンプルコード:

HtmlConverter.convertToPdf(
    "<b>This text should be written in bold.</b>", 
    new PdfWriter(new File("C://users/mentre83/output.pdf"))); 
+0

提案していただきありがとうございます、私はこれがより良い解決策であるかどうかを確認するための試用版ライセンスを取得しようとします。私はまだ2つのマシンで異なる動作の原因を特定したいと思います。 – mentre83

+0

私は思うが(これは実際にコードを実行するよりも経験に基づいている)、おそらくフォントや他のリソースがあるコンピュータでは利用できないが、他のリソースでは何かをしなければならないだろう。たとえば、グリフがレンダリングできない場合(フォントにそのグリフがないため)、iTextは単にその文字をレンダリングしません。すべての文字がスキップされた場合、コンテンツは追加されず、「ドキュメントにはページがありません」という例外が発生します。また、Arialユニコードはすべてのマシンで使用できるわけではありません。 –

+0

私の考えはまさに。グリフは問題ではないようですが、これはフォントと関係があると思われます。リソース面では、私がコードをテストするために使用したマシン(私もいくつかのVMでも試しました)はかなり同じようです。 – mentre83

関連する問題