Pdf generation iTextSharp SetListSymbol不工作

Pdf generation iTextSharp SetListSymbol不工作,pdf-generation,itextsharp,Pdf Generation,Itextsharp,我正在尝试用iTextSharp生成的PDF设置样式 每当我试图将符号设置为列表项时,SetListSymbol似乎对我不起作用 下面是我使用的代码: var elements = HTMLWorker.ParseToList(overviewReader,null); foreach (var element in elements) { //element var list = element as List; if (list != null) {

我正在尝试用iTextSharp生成的PDF设置样式

每当我试图将符号设置为列表项时,
SetListSymbol
似乎对我不起作用

下面是我使用的代码:

var elements = HTMLWorker.ParseToList(overviewReader,null);

foreach (var element in elements)
{
    //element
    var list = element as List;
    if (list != null)
    {
        //list.Symbol.GetImage();
        list.SetListSymbol("\u25A0");
        list.IndentationLeft = 20f;
        doc.Add(list);
    }
    else
    {
        doc.Add(element);
    }
}

iText和iTextSharp中的
HTMLWorker
通过
iTextSharp.text.html.simpleparser.StyleSheet
支持一些非常有限的“样式表”。这些样式表松散地基于HTML/CSS属性,但只是最基本的(想想HTML3.2)

您要做的三件主要事情是(1)加载字体,(2)创建指向该字体的
样式表
,(3)将
样式表
绑定到
HTMLWorker
。我将从我的系统中部分地提取一些代码

iTextSharp不会自动在整个系统中搜索字体,因此您需要手动注册它们。(实际上,有一种方法可以调用并告诉iTextSharp猜测加载字体,但这要快得多。)

步骤1,加载字体,在本例中为Curlz

//Path to our font
string OurFont = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "CURLZ___.TTF");
//Register the font with iTextSharp
iTextSharp.text.FontFactory.Register(OurFont);
第2步,创建一个
样式表
,并将其指向我们的字体。我还将设置一些其他属性来展示它们

//Create a new stylesheet
iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet();
//Set the default body font to our registered font's internal name
ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI, iTextSharp.text.html.HtmlTags.FACE, "Curlz MT");
ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI, iTextSharp.text.html.HtmlTags.COLOR, "FF0000");
ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI, iTextSharp.text.html.HtmlTags.SIZE, "50");
步骤3,将
样式表
绑定到我们的
HTMLWorker

//Use our StyleSheet from above when parsing
var elements = HTMLWorker.ParseToList(overviewReader, ST);
下面是一个以iTextSharp 5.2.0为目标的C#WinForms应用程序,它展示了上述所有功能

using System;
using System.IO;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;

namespace WindowsFormsApplication2 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            //Path to our font
            string FontArial = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "CURLZ___.TTF");
            //Register the font with iTextSharp
            iTextSharp.text.FontFactory.Register(FontArial);

            //Create a new stylesheet
            iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet();
            //Set the default body font to our registered font's internal name
            ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI, iTextSharp.text.html.HtmlTags.FACE, "Curlz MT");
            ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI, iTextSharp.text.html.HtmlTags.COLOR, "FF0000");
            ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI, iTextSharp.text.html.HtmlTags.SIZE, "50");

            //Sample HTML
            var html = @"<ul><li>Test</li></ul>";
            //File to output
            var outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");
            //Basic PDF creation, nothing special here
            using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
                using (Document doc = new Document(PageSize.LETTER)) {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                        doc.Open();
                        //Bind a reader to our HTML
                        using (StringReader overviewReader = new StringReader(html)) {
                            //Use our StyleSheet from above when parsing
                            var elements = HTMLWorker.ParseToList(overviewReader, ST);
                            //Loop through each element
                            foreach (var element in elements) {
                                //See if the element is a list item
                                var list = element as List;
                                if (list != null) {
                                    //Set some properties
                                    list.SetListSymbol("\u25A0");
                                    list.IndentationLeft = 20f;
                                }
                                //Add the element to the document
                                doc.Add(element);
                            }
                        }
                        doc.Close();
                    }
                }
            }
            this.Close();
        }
    }
}
使用系统;
使用System.IO;
使用System.Windows.Forms;
使用iTextSharp.text;
使用iTextSharp.text.html.simpleparser;
使用iTextSharp.text.pdf;
命名空间Windows窗体应用程序2{
公共部分类Form1:Form{
公共表格1(){
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e){
//我们字体的路径
string FontArial=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts),“CURLZ_u__;uf”);
//使用iTextSharp注册字体
iTextSharp.text.FontFactory.Register(FontArial);
//创建一个新的样式表
iTextSharp.text.html.simpleparser.StyleSheet ST=new iTextSharp.text.html.simpleparser.StyleSheet();
//将默认正文字体设置为注册字体的内部名称
ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI,iTextSharp.text.html.HtmlTags.FACE,“Curlz MT”);
ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI,iTextSharp.text.html.HtmlTags.COLOR,“FF0000”);
ST.LoadTagStyle(iTextSharp.text.html.HtmlTags.LI,iTextSharp.text.html.HtmlTags.SIZE,“50”);
//示例HTML
var html=@“
  • 测试
    • ”; //要输出的文件 var outputFile=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),“Test.pdf”); //基本的PDF创建,这里没有什么特别的 使用(FileStream fs=newfilestream(outputFile,FileMode.Create,FileAccess.Write,FileShare.None)){ 使用(文档文档=新文档(页面大小.字母)){ 使用(PdfWriter writer=PdfWriter.GetInstance(doc,fs)){ doc.Open(); //将阅读器绑定到我们的HTML 使用(StringReader概览阅读器=新的StringReader(html)){ //解析时使用上面的样式表 var elements=HTMLWorker.parsetList(概览阅读器,ST); //循环遍历每个元素 foreach(元素中的var元素){ //查看元素是否为列表项 var list=元素作为列表; 如果(列表!=null){ //设置一些属性 list.SetListSymbol(“\u25A0”); list.IndentationLeft=20f; } //将元素添加到文档中 单据新增(要素); } } doc.Close(); } } } 这个。关闭(); } } }
List objects=HTMLWorker.parsetList(新的StringReader(格式),null)


作为补充说明,HTMLWorker已经停止使用,取而代之的是可以发布它不能使用的HTML。我刚刚用
  • 测试
试过了,效果如预期。另外,请记住,您使用的任何字体都必须支持该符号。@ChrisHaas我认为您的建议是可能的,但是我正在努力找到一种很好的方法来设置字体以列出项目,您能给我指出一个方向吗?
                foreach (IElement element in objects)
                {

                    List list = new List();
                    list.SetListSymbol("\u2022");
                    list.IndentationLeft = 20f;                        
                    list.Add(element);
                    if (list.Chunks.Count == 0)
                    {
                        doc1.Add(element);
                    }
                    else
                    {
                        doc1.Add(list);
                    }
                }