これはかなり面白い問題だったので、質問に+1してください。
最初のステップは、iTextSharp XML WorkerがHTML
td
タグをサポートしているかどうかを調べることでした。このマッピングは、ソースのiTextSharp.tool.xml.html.Tagsにあります。そこではtd
がiTextSharp.tool.xml.html.table.TableDataにマッピングされているので、カスタムタグプロセッサを実装する作業が簡単になります。私。私たちはクラスから継承し、End()
を上書きする必要があるすべて:
public class TableDataProcessor : TableData
{
/*
* a **very** simple implementation of the CSS writing-mode property:
* https://developer.mozilla.org/en-US/docs/Web/CSS/writing-mode
*/
bool HasWritingMode(IDictionary<string, string> attributeMap)
{
bool hasStyle = attributeMap.ContainsKey("style");
return hasStyle
&& attributeMap["style"].Split(new char[] { ';' })
.Where(x => x.StartsWith("writing-mode:"))
.Count() > 0
? true : false;
}
public override IList<IElement> End(
IWorkerContext ctx,
Tag tag,
IList<IElement> currentContent)
{
var cells = base.End(ctx, tag, currentContent);
var attributeMap = tag.Attributes;
if (HasWritingMode(attributeMap))
{
var pdfPCell = (PdfPCell) cells[0];
// **always** 'sideways-lr'
pdfPCell.Rotation = 90;
}
return cells;
}
}
インラインコメントで述べたように、これはあなたの特定のニーズのための非常に単純な実装です。 writing-modeCSS
property valueをサポートする追加のロジックを追加し、サニティチェックを含める必要があります。 @Danielが残したコメントに基づいて
UPDATE
、それはPDF
にHTML
を変換するときにカスタムCSS
を追加する方法は明らかではありません。まず、更新されたHTML:
string XHTML = @"
<h1>Table with Vertical Text</h1>
<table><tr>
<td style='writing-mode:sideways-lr;text-align:center;width:40px;'>First</td>
<td style='writing-mode:sideways-lr;text-align:center;width:40px;'>Second</td></tr>
<tr><td style='text-align:center'>1</td>
<td style='text-align:center'>2</td></tr></table>
<h1>Table <u>without</u> Vertical Text</h1>
<table width='50%'>
<tr><td class='light-yellow'>0</td></tr>
<tr><td>1</td></tr>
<tr><td class='light-yellow'>2</td></tr>
<tr><td>3</td></tr>
</table>";
次にカスタムCSSの小さなスニペット:
string CSS = @"
body {font-size: 12px;}
table {border-collapse:collapse; margin:8px;}
.light-yellow {background-color:#ffff99;}
td {border:1px solid #ccc;padding:4px;}
";
少し難しい部分は余分なセットアップです - あなたは、一般的に見ボックスXMLWorkerHelper.GetInstance().ParseXHtml()
のうち、簡単なを使用することはできませんここにある。ここであなたが始める必要があり、単純なヘルパーメソッドです:
public void ConvertHtmlToPdf(string xHtml, string css)
{
using (var stream = new FileStream(OUTPUT_FILE, FileMode.Create))
{
using (var document = new Document())
{
var writer = PdfWriter.GetInstance(document, stream);
document.Open();
// instantiate custom tag processor and add to `HtmlPipelineContext`.
var tagProcessorFactory = Tags.GetHtmlTagProcessorFactory();
tagProcessorFactory.AddProcessor(
new TableDataProcessor(),
new string[] { HTML.Tag.TD }
);
var htmlPipelineContext = new HtmlPipelineContext(null);
htmlPipelineContext.SetTagFactory(tagProcessorFactory);
var pdfWriterPipeline = new PdfWriterPipeline(document, writer);
var htmlPipeline = new HtmlPipeline(htmlPipelineContext, pdfWriterPipeline);
// get an ICssResolver and add the custom CSS
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
cssResolver.AddCss(css, "utf-8", true);
var cssResolverPipeline = new CssResolverPipeline(
cssResolver, htmlPipeline
);
var worker = new XMLWorker(cssResolverPipeline, true);
var parser = new XMLParser(worker);
using (var stringReader = new StringReader(xHtml))
{
parser.Parse(stringReader);
}
}
}
}
の代わりに上記のコード例、see the documentationの説明を焼き直し、あなたがする必要がある理由のより良いアイデアを得るために(iTextのは、ウェイバックマシンにリンクされ、ドキュメントを削除しました)そのようにパーサーをセットアップしてください。
にも注意してください:
- XMLワーカーが働くかあなたが欲しいどれだけ近いかに関しては動作しません何を試して必要があるかもしれませんあなたはので、ないサポートにすべてのCSS2/CSS3のプロパティを行いますPDFをブラウザーに表示されたHTMLを見てください。
HTML
スニペットはタグを削除しました。このスタイルはtd
タグに直接適用できるためです。
- インライン
width
プロパティ。省略すると、テキストが水平方向にレンダリングされた場合に一致する可変幅になります。
iTextSharpおよびXML Workerバージョン5.5でテスト済みです。UTF8と
あなたがこれを行うには、カスタムコードを記述する必要が9は、ここで更新結果です。あなたが期待するものの 'HTML'サンプルを追加すると、誰かが手助けすることができます... – kuujinbo