文字列変数を介して Web ページを PDF ドキュメントに変換するように設計されたコードをデバッグしようとして立ち往生しています。これは iTextSharp c# ツール (xmlworker) を使用し、html2pdf.csproj という sourceforge ソース コードに付属するサンプル コードを変更したものです。このコード例は、既存の html ファイルを PDF ファイルに変換し、変換されたファイルと同じディレクトリに保存します。HTML 形式のテキストを含む文字列変数があり、印刷目的で Web 環境のクライアント側に渡されるバイト配列として返されるようにしようとしています。問題は、「ドキュメントにページがありません」という「IOException was unhandled by user code」というメッセージが表示されることです。これが何を意味するのか、また問題を診断する方法が少しわかりません。ファイル ベースのシステムを使用したサンプル コードは機能し、HTML 文字列の静的バージョンを PDF に正常に変換できました。以下は、変更されたコードです。
private byte[] createPDF(string html, string filename) {
MemoryStream msOutput = new MemoryStream();
string printPDFCSS = Server.MapPath("/content/printPDF.css");
Document doc = new Document(PageSize.LETTER);
doc.SetMargins(doc.LeftMargin, doc.RightMargin, 35, 0);
PdfWriter pdfWriter = PdfWriter.GetInstance(doc, msOutput);
doc.Open();
Dictionary<String, String> substFonts = new Dictionary<String, String>();
substFonts["Arial Unicode MS"] = "Helvetica";
CssFilesImpl cssFiles = new CssFilesImpl();
cssFiles.Add(XMLWorkerHelper.GetCSS(new FileStream(printPDFCSS, FileMode.Open)));
StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver(cssFiles);
HtmlPipelineContext hpc = new HtmlPipelineContext(new CssAppliersImpl(new UnembedFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS, substFonts)));
hpc.SetImageProvider(new ImageProvider(filename));
hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(Tags.GetHtmlTagProcessorFactory());
HtmlPipeline htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(doc, pdfWriter));
IPipeline pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser xmlParse = new XMLParser(true, worker);
xmlParse.Parse(msOutput);
doc.Close();
return msOutput.ToArray();
}