将HTML转换为多列PDF

本文关键字:PDF HTML 转换 | 更新日期: 2023-09-27 18:29:48

我正在尝试使用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库可以修复此问题。

将HTML转换为多列PDF

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

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

如果你去看官方的XMLWorker文档,你会发现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代码视为伪代码。