首页 > 解决方案 > ITextsharp Html2Pdf CSS 问题

问题描述

我是 iTextSharp 的新手,目前正在使用 Html2pdf(iTextSharp 扩展)将 HTML 转换为 PDF。我能够生成 pdf,但无法在每一页上为 pdf 添加徽标。

图像来了,但我无法更改图像的宽度。

我用于 pdf 徽标的 CSS 如下:

@page { 
@top-left { 
content:"test "; 
background:url(../images/template/test_logo_pdf.jpg) no-repeat 0px 0px;
border:1px solid red;
background-color: #cccccc;

margin-top:10px;
} 
@top-right { 
content: flow(header); 
}
@bottom-right { 
content: "Page " counter(page) " of " counter(pages); 
font: 8pt Arial, sans-serif; 
} 
@bottom-left { 
content: string(repname); 
font: 8pt Arial, sans-serif; 
}
}

标签: htmlcssitext

解决方案


控制添加到页边距框中的图像的尺寸确实并不容易。我可以建议的一种可能的方法是将图像添加为内容(而不是背景图像)并使用自定义标签工作者,这将根据需要为页边距框子图像指定高度和宽度:

HTML:

@top-left {  
  content: url(../images/template/test_logo_pdf.jpg);
  border:1px solid red;
  background-color: #cccccc;
  margin-top:10px;
}

这是 Java 代码,但 .NET 版本具有完全相同的 API,只是代码样式不同(方法名称开头的大写字母等):

private static class PageMarginBoxImagesTagWorkerFactory extends DefaultTagWorkerFactory {
    @Override
    public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
        if (tag.name().equals(PageMarginBoxContextNode.PAGE_MARGIN_BOX_TAG)) {
            return new PageMarginBoxImagesWorker(tag, context);
        }
        return super.getCustomTagWorker(tag, context);
    }
}

private static class PageMarginBoxImagesWorker extends PageMarginBoxWorker {
    public PageMarginBoxImagesWorker(IElementNode element, ProcessorContext context) {
        super(element, context);
    }

    @Override
    public boolean processTagChild(ITagWorker childTagWorker, ProcessorContext context) {
        if (childTagWorker.getElementResult() instanceof Image) {
            // Or set fixed dimensions via setWidth/setHeight
            ((Image) childTagWorker.getElementResult()).setAutoScale(true);
        }
        return super.processTagChild(childTagWorker, context);
    }
}

并通过在以下位置指定 PageMarginBoxImagesTagWorkerFactory 来使用它ConverterProperties

HtmlConverter.convertToPdf(htmlSrc, pdfDocument, 
        new ConverterProperties()
                .setTagWorkerFactory(new PageMarginBoxImagesTagWorkerFactory()));

推荐阅读