Xmlworkerでテキスト方向のボトムアップを書くことは可能ですか?テーブルで使用したいと思います。私のコードは
<table border=1>
<tr>
<td style="padding-right:18px">
<p style="writing-mode:sideways-lr;text-align:center">First</p</td>
<td style="padding-right:18px">
<p style="writing-mode:sideways-lr;text-align:center">Second</p></td></tr>
<tr><td><p style="text-align:center">1</p> </td>
<td><p style="text-align:center">2</p></td>
</tr>
</table>
ただし、htmlからpdfへの変換後は機能しません。テキストFIRSTおよびSECONDは、下から上への方向ではありません。
これは非常に興味深い問題でしたので、質問に+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;
}
}
_
インラインコメントで述べたように、これは特定のニーズに合わせたveryシンプルな実装です。他の writing-modeCSS
プロパティ値 をサポートするために、追加のロジックを追加する必要があります。健全性チェックを含めます。
@ Daniel によって残されたコメントに基づいて、CSS
をHTML
に変換するときにカスタムPDF
を追加する方法は明確ではありません。最初に更新された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;}
";
_
少し難しい部分は追加のセットアップです-ここSOで一般的に見られる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);
}
}
}
}
_
上記のサンプルコードの説明を再ハッシュする代わりに、 ドキュメントを参照 (ウェイバックマシンにリンクされたiTextのドキュメントを削除)パーサーをそのようにセットアップする必要がある理由をよりよく理解するために。
また注意してください:
HTML
タグに直接適用できるため、p
スニペットはtd
タグを削除しました。width
プロパティ。省略した場合、列はテキストが水平にレンダリングされた場合に一致する可変幅になります。ITextSharpおよびXML Workerバージョン5.5.9でテスト済みupdated結果は次のとおりです。
テーブルの場所ごとにpdf内のテーブル内に画像タグをレンダリングする方法は? -@kuujinbo
<table cellpadding="30" class="table table-striped" id="StudentInfoListTable">
<tr>
<td><img src="@Model.img" alt="" height="200" width="200" /></td>
<td class="middle"></td>
<td>LICENSE ID - @Html.DisplayFor(m => m.LicenseID)</td>
</tr>
<tr>
<td>NAME: </td>
<td class="middle"></td>
<td>@Html.DisplayFor(m => m.Name)</td>
</tr>
<tr>
<td>@Html.DisplayFor(m => m.Relo) </td>
<td class="middle"></td>
<td>@Html.DisplayFor(m => m.careOf)</td>
</tr>
<tr>
<td>GENDER: </td>
<td class="middle"></td>
<td>@Html.DisplayFor(m => m.gender)</td>
</tr>
<tr>
<td>BLOOD GROUP: </td>
<td class="middle"></td>
<td>@Html.DisplayFor(m => m.blood)</td>
</tr>
<tr>
<td>DATE OF BIRTH: </td>
<td class="middle"></td>
<td>@Html.DisplayFor(m => m.date)</td>
</tr>
<tr>
<td>CONTACT NO: </td>
<td class="middle"></td>
<td>@Html.DisplayFor(m => m.Mobile)</td>
</tr>
<tr>
<td>ADDRESS: </td>
<td class="middle"></td>
<td>@Html.DisplayFor(m => m.Address)</td>
</tr>
<tr>
<td>Signature </td>
<td class="middle"></td>
<td><img src="@Model.sign" alt="" style="background-color:white;"/></td>
</tr>
</table>
public void addHtmlToPdf(Document document, PdfWriter writer, String html) {
PdfPTable table = new PdfPTable(1);
PdfPCell cell = new PdfPCell();
ElementList list = XMLWorkerHelper.ParseToElementList(html, null);
foreach(IElement element in list) {
cell.AddElement(element);
}
table.AddCell(cell);
document.Add(table);
}
Utf8の代替:
public void addHtmlToPdf_Utf8(Document document, PdfWriter writer, String html)
{
XMLWorkerHelper xml = XMLWorkerHelper.GetInstance();
xml.ParseXHtml(writer, document, stringToStream(html), System.Text.Encoding.UTF8);
}
public Stream stringToStream(string txt) {
var stream = new MemoryStream();
var w = new StreamWriter(stream);
w.Write(txt);
w.Flush();
stream.Position = 0;
return stream;
}