使用iTextsharp.dll生成PDF时不应用CSS

Kar*_*tik 7 .net c# pdf itextsharp

我使用iTextSharp.dll生成PDF,但问题是我无法应用该CSS.我有一个div:

 <div id="personal" class="headerdiv">
      Personal Data
 </div>
Run Code Online (Sandbox Code Playgroud)

现在我的.aspx.cs代码是这样的:

   iTextSharp.text.html.simpleparser.StyleSheet styles = new         iTextSharp.text.html.simpleparser.StyleSheet();

    styles.LoadTagStyle("#headerdiv", "height", "30px");
    styles.LoadTagStyle("#headerdiv", "font-weight", "bold");
    styles.LoadTagStyle("#headerdiv", "font-family", "Cambria");
    styles.LoadTagStyle("#headerdiv", "font-size", "20px");
    styles.LoadTagStyle("#headerdiv", "background-color", "Blue");
    styles.LoadTagStyle("#headerdiv", "color", "White");
    styles.LoadTagStyle("#headerdiv", "padding-left", "5px");

    HTMLWorker worker = new HTMLWorker(document);
    worker.SetStyleSheet(styles);


    // step 4: we open document and start the worker on the document 
    document.Open();
    worker.StartDocument();
    // step 5: parse the html into the document      
    worker.Parse(reader);
    // step 6: close the document and the worker     
    worker.EndDocument();
    worker.Close();
    document.Close();
Run Code Online (Sandbox Code Playgroud)

Chr*_*aas 12

这里有几件事情.首先,iText和iTextSharp中的HTML/CSS解析器远未完成.他们肯定非常强大,但还有很长的路要走.每个版本都会变得更好,所以请务必确保您使用的是最新版本.

其次,我在iText/iTextSharp的一个名为XMLWorker的附加组件中看到了更多的HTML/CSS活动,你可能想看一下.你不再"加载样式"了,你只需要传入原始的HTML/CSS,它就会发现很多东西.你可以看到一些这方面的例子,请参阅列表支持的CSS属性在这里,在这里下载(并获得两个丢失的文件在这里和这里).

第三,LoadTagStyle用于加载HTML标记的样式属性,而不是CSS ID或类.您想要LoadStyle按类加载:

styles.LoadStyle("<classname>", "<attribute>", "<value>");
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法仍然无法完成您想要的任务.例如,要改变你认为你会说的字体大小:

styles.LoadStyle("headerdiv", "font-size", "60ptx);
Run Code Online (Sandbox Code Playgroud)

但要使其工作,您只能使用相对的HTML字体大小(1,2,-1等)或PT大小,您必须使用该size属性:

styles.LoadStyle("headerdiv", "size", "60pt");
//or
styles.LoadStyle("headerdiv", "size", "2");
Run Code Online (Sandbox Code Playgroud)

在LoadStyle诚实的感觉就像是只是部分完成,我建议不要使用它实际上是一个事后的想法.相反,如果您可以,我建议直接内联编写样式属性:

string html = "<div id=\"personal\" class=\"headerdiv\" style=\"padding-left:50px;font-size:60pt;font-family:Cambria;font-weight:700;\">Personal Data</div>";
Run Code Online (Sandbox Code Playgroud)

显然,这会破坏CSS的要点,再一次,这就是为什么他们正在开发上面的新XMLWorker.

最后,要按名称使用字体,首先必须使用iTextSharp注册它们,它不会去寻找它们:

iTextSharp.text.FontFactory.Register(@"c:\windows\fonts\cambria.ttc", "Cambria");
Run Code Online (Sandbox Code Playgroud)