gpt4 book ai didi

c# - 使用itextsharp xmlworker将html转pdf并竖写文字

转载 作者:太空狗 更新时间:2023-10-29 13:13:47 24 4
gpt4 key购买 nike

在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 ,这使得实现自定义标签处理器的工作变得更容易一些。 IE。我们需要做的就是从类继承并覆盖 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-mode CSS property value ,并包括任何完整性检查。

更新

根据 @Daniel 留下的评论,不清楚如何在将 HTML 转换为 PDF 时添加自定义 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;}
";

稍微困难的部分是额外的设置 - 您不能使用 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);
}
}
}
}

see the documentation 不是重复对上面示例代码的解释(iText 删除了文档,链接到 Wayback Machine)以更好地了解为什么需要以这种方式设置解析器。

另请注意:

  1. XML Worker 支持所有 CSS2/CSS3 属性,因此您可能需要试验哪些有效或无效,以确定您希望PDF 查看浏览器中显示的 HTML。
  2. HTML 片段删除了 p 标签,因为样式可以直接应用于 td 标签。
  3. 内联 width 属性。如果省略,列的宽度将与水平呈现的文本相匹配。

使用 iTextSharp 和 XML Worker 版本 5.5.9 进行测试这是更新的结果:

enter image description here

关于c# - 使用itextsharp xmlworker将html转pdf并竖写文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36180131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com