【问题标题】:iTextSharp add ( css style or a css file) and download pdf fileiTextSharp 添加(css 样式或 css 文件)并下载 pdf 文件
【发布时间】:2017-05-11 12:25:38
【问题描述】:

终于搞定了

var inputString = @"<html>
<body>
<table  class='table-bordered'>
    <thead>
        <tr>
            <th>Customer Name</th>
            <th>Customer's Address</th>
        </tr>
    </thead>
<tbody>
    <tr>
        <td> XYZ </td>
        <td> Bhubaneswar </td>
    </tr>
    <tr>
        <td> MNP </td>
        <td> Cuttack </td>
    </tr>
</tbody>
</table>
</body>
</html>";


List<string> cssFiles = new List<string>();
cssFiles.Add(@"/Content/bootstrap.css");

var output = new MemoryStream();

var input = new MemoryStream(Encoding.UTF8.GetBytes(inputString));

var document = new Document();
var writer = PdfWriter.GetInstance(document, output);
writer.CloseStream = false;

document.Open();
var htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(iTextSharp.tool.xml.html.Tags.GetHtmlTagProcessorFactory());

ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssFiles.ForEach(i => cssResolver.AddCssFile(System.Web.HttpContext.Current.Server.MapPath(i), true));

var pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
var worker = new XMLWorker(pipeline, true);
var p = new XMLParser(worker);
p.Parse(input);
document.Close();
output.Position = 0;


Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=myfile.pdf");
Response.BinaryWrite(output.ToArray());
// myMemoryStream.WriteTo(Response.OutputStream); //works too
Response.Flush();
Response.Close();
Response.End();

【问题讨论】:

  • @AnupSharma 我想减小里面表格的字体大小。
  • HTMLWorker 被弃用,取而代之的是 XML Worker。 HTMLWorker 不支持 CSS(并且永远不会支持 CSS,因为它的使用已经停止)。在 iText 官方网站上阅读有关 XML Worker 的更多信息。
  • 好吧,给我们看看 HTML 和 CSS。 the web site 上有大量工作示例。但是,在您的问题中使用HTMLWorker 将不起作用。更改您的问题,以便我可以看到您使用 XML Worker,我可能会投票重新打开它。但是,在当前状态下,您的问题的答案是:您想要的不适用于HTMLWorker,请改用 XML Worker。 (这需要 iTextSharp DLL 旁边的额外 DLL。)
  • 我没有看到您使用 XML Worker。更新您的问题以显示您的 XML Worker 代码并显示您的 HTML 和 CSS。
  • 输入的 HTML 无效。

标签: c# model-view-controller download itext html-to-pdf


【解决方案1】:

正如您自己发现的那样,您遇到的主要问题是向 XML Worker 提供无效的 HTML 引起的。我编写了一个 Java 示例,它等同于您的(更新的)C# 示例:

public static final String CSS = "th { background-color: #C0C0C0; font-size: 16pt; } "
    + "td { font-size: 10pt; }";
public static final String HTML = "<html><body><table  class='table-bordered'>"
    + "<thead><tr><th>Customer Name</th><th>Customer's Address</th> </tr></thead>"
    + "<tbody><tr><td> XYZ </td><td> Bhubaneswar </td></tr>"
    + "<tr><td> MNP </td><td> Cuttack </td></tr></tbody>"
    + "</table></body></html>";

/**
 * @param file
 * @throws IOException
 * @throws DocumentException
 */
public void createPdf(String file) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    document.open();


    CSSResolver cssResolver = new StyleAttrCSSResolver();
    CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(CSS.getBytes()));
    cssResolver.addCss(cssFile);

    // HTML
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

    // Pipelines
    PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
    HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);

    // XML Worker
    XMLWorker worker = new XMLWorker(css, true);
    XMLParser p = new XMLParser(worker);
    p.parse(new ByteArrayInputStream(HTML.getBytes()));
    document.close();
}

生成的表格如下所示:

您可以调整CSS 中存储的值,为表格创建更好的外观。

【讨论】:

  • @Brunno Lowagie 谢谢
  • @Bruno 我没有看到新的 ByteArrayInputStream(HTML.getBytes()) 方法。它有什么作用?
  • ByteArrayInputStream 是 JDK 中的标准 Java 类。这是一个InputStream 实现,它采用byte[],并允许您将其用作InputStream。它没有什么特别之处。这只是Java。顺便说一句:如果您希望将 HTML 转换为 PDF,请在开始编写代码之前阅读 Converting HTML to PDF using iText
猜你喜欢
  • 2014-11-28
  • 2021-09-21
  • 2017-05-24
  • 1970-01-01
  • 2011-03-01
  • 2020-12-09
  • 1970-01-01
  • 2013-08-10
  • 2019-01-30
相关资源
最近更新 更多