【问题标题】:converting HTML to a multi-column PDF将 HTML 转换为多列 PDF
【发布时间】:2015-01-06 19:49:00
【问题描述】:

我正在尝试使用 iText for .NET 从 HTML 生成多列 PDF。 我正在使用 CSS3 语法生成两列。

下面的代码对我不起作用。

CSS

column-count:2; 

C#代码

StringReader html = new StringReader(@"
<div style='column-count:2;'>Sample Text. Sample Text. Sample Text. Sample Text. 
Sample Text. Sample Text. Sample Text. Sample Text. Sample Text. Sample Text. 
Sample Text. Sample Text. Sample Text. Sample Text. Sample Text. Sample Text. 
Sample Text. Sample Text. </div>
");

        Document document = new Document();
        PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(@"d:\temp\xyz.pdf", FileMode.Create));
        document.Open();
        XMLWorkerHelper.GetInstance().ParseXHtml(
          writer, document, html
        );
        document.Close();

请提出此代码中的问题。或者是否有任何其他 HTML 到 PDF 库可用于解决此问题。

【问题讨论】:

    标签: c# html css pdf itext


    【解决方案1】:

    XML Worker 不支持 CSS 属性 column-count,而且可能永远不会支持。

    但是,这并不意味着您不能在列中显示 HTML。

    如果您访问官方 XML Worker 文档,您会找到 ParseHtmlObjects,我们在其中解析一个大型 HTML 文件并将其呈现为包含两列的 PDF:walden5.pdf

    这是通过首先将 HTML 解析为 ElementList 来完成的:

    // CSS
    CSSResolver cssResolver =
            XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
    // HTML
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
    htmlContext.autoBookmark(false);
    // Pipelines
    ElementList elements = new ElementList();
    ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);
    HtmlPipeline html = new HtmlPipeline(htmlContext, end);
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
    // XML Worker
    XMLWorker worker = new XMLWorker(css, true);
    XMLParser p = new XMLParser(worker);
    

    一旦我们有了Element 对象的列表,我们就可以将它们添加到ColumnText 对象中:

    // step 1
    Document document = new Document(PageSize.LEGAL.rotate());
    // step 2
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
    // step 3
    document.open();
    // step 4
    Rectangle left = new Rectangle(36, 36, 486, 586);
    Rectangle right = new Rectangle(522, 36, 972, 586);
    ColumnText column = new ColumnText(writer.getDirectContent());
    column.setSimpleColumn(left);
    boolean leftside = true;
    int status = ColumnText.START_COLUMN;
    for (Element e : elements) {
        if (ColumnText.isAllowedElement(e)) {
            column.addElement(e);
            status = column.go();
            while (ColumnText.hasMoreText(status)) {
                if (leftside) {
                    leftside = false;
                    column.setSimpleColumn(right);
                }
                else {
                    document.newPage();
                    leftside = true;
                    column.setSimpleColumn(left);
                }
                status = column.go();
            }
        }
    }
    // step 5
    document.close();
    

    如您所见,您需要在这里做出一些决定:您需要定义页面上的矩形。您需要引入新页面等...

    注意:本文档目前没有 C# 端口。请把 Java 代码看作是伪代码。

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2010-12-31
      • 1970-01-01
      • 2016-12-01
      • 2014-11-16
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多