首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML格式的iTextSharp XMLWorkerHelper和图像

HTML格式的iTextSharp XMLWorkerHelper和图像
EN

Stack Overflow用户
提问于 2015-03-26 14:27:30
回答 1查看 11.1K关注 0票数 3

底线是我使用iTextSharp将HTML写成一个PDF --带有图像的。现在,我正在使用iTextSharp的最新版本,即5.5.5.0。我可以访问布鲁诺氏图书,我正在使用demo.iTextSupport.com给出的方法进行转换。不幸的是,XMLWorkerHelper,似乎没有对这本书的任何引用,而这正是我从这本书创建PDF的时候使用的。

下面是我终于开始工作的方法,它成功地从格式良好的HTML字符串生成PDF:

代码语言:javascript
复制
private string createPDFFromHtml(string htmlString, string outputFileName)
{
    string result = string.Empty;

    try
    {
        if (!string.IsNullOrEmpty(htmlString) && !string.IsNullOrEmpty(outputFileName) && !File.Exists(outputFileName))
        {
            using (FileStream fos = new FileStream(outputFileName, FileMode.Create))
            {
                using (MemoryStream inputMemoryStream = new MemoryStream(Encoding.ASCII.GetBytes(htmlString)))
                {
                    using (TextReader textReader = new StreamReader(inputMemoryStream, Encoding.ASCII))
                    {
                        using (Document pdfDoc = new Document())
                        {
                            using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fos))
                            {
                                XMLWorkerHelper helper = XMLWorkerHelper.GetInstance();
                                pdfDoc.Open();
                                helper.ParseXHtml(pdfWriter, pdfDoc, textReader);
                                result = "Successfully Created new HTML--> PDF Document!";
                                pdfWriter.CloseStream = false;
                            }
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        result = "Exception: " + ex.Message;
    }

    return result;
}

这是可行的,我想要做的是创建一个信头图像,这个图像只是一些JPG,我把它放在硬盘上的某个地方。

这是我已经尝试过的,但是虽然它成功地将图像按下了我想要的位置和我想要的方式,但是PDF的其余部分已经严重地截断了输出。

代码语言:javascript
复制
 private string createPDFFromHtmlWithImage(string htmlString, string outputFileName, string headerImagePath)
        {
            string result = string.Empty;

            try
            {
                if (!string.IsNullOrEmpty(htmlString) && !string.IsNullOrEmpty(outputFileName) && !File.Exists(outputFileName))
                {
                    using (FileStream fos = new FileStream(outputFileName, FileMode.Create))
                    {
                        using (MemoryStream inputMemoryStream = new MemoryStream(Encoding.ASCII.GetBytes(htmlString)))
                        {
                            using (TextReader textReader = new StreamReader(inputMemoryStream, Encoding.ASCII))
                            {
                                using (Document pdfDoc = new Document())
                                {
                                    using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fos))
                                    {
                                        pdfDoc.Open();
                                        Image img = Image.GetInstance(headerImagePath);
                                        if (img != null)
                                        {
                                            img.ScaleToFit(540f, 300f);
                                            pdfDoc.Add(img);
                                        }

                                        XMLWorkerHelper helper = XMLWorkerHelper.GetInstance();
                                        helper.ParseXHtml(pdfWriter, pdfDoc, textReader);

                                        result = "Successfully Created new HTML--> PDF Document!";
                                        pdfWriter.CloseStream = false;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                result = "Exception: " + ex.Message;
            }

            return result;
        }

结果是,PDF有我想要的图像,然后基本上是我的HTML的第一个(但即使DIV没有被完全显示),然后什么也没有。

因此,我想我可能不仅需要将textReader送入pdfDoc,还可能需要做一些“添加”之类的工作。

这就是我迷路的地方。

我认为我仍然需要使用XMLWorkerHelper,但是我需要用IElementHandler来做一些事情,而不是把整个事情都塞进pdfWriter中。

补充研究显示,我可以通过克里斯·哈斯在这里发表精彩文章使用IElements做一些技巧。

所以,我制作了我自己的IElementHandler,就像克里斯展示的那样(除了我做了很长的一段路,请容忍我):

代码语言:javascript
复制
public class HtmlElementHandler : IElementHandler
{
    public List<IElement> elementList = new List<IElement>();

    public void Add(IWritable e)
    {
        if (e != null && e is WritableElement)
        {
            WritableElement we = e as WritableElement;

            if (we != null)
            {
                IList<IElement> weList = we.Elements();
                if (weList.Any())
                {
                    elementList.AddRange(weList);
                }
            }
        }
    }
}

现在使用以下代码:

代码语言:javascript
复制
 private string createPDFFromHtmlWithImageElemental(string htmlString, string outputFileName, string headerImagePath)
        {
            string result = string.Empty;

            try
            {
                if (!string.IsNullOrEmpty(htmlString) && !string.IsNullOrEmpty(outputFileName) && !File.Exists(outputFileName))
                {
                    using (FileStream fos = new FileStream(outputFileName, FileMode.Create))
                    {
                        using (MemoryStream inputMemoryStream = new MemoryStream(Encoding.ASCII.GetBytes(htmlString)))
                        {
                            using (TextReader textReader = new StreamReader(inputMemoryStream, Encoding.ASCII))
                            {
                                using (Document pdfDoc = new Document())
                                {
                                    using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fos))
                                    {
                                        pdfDoc.Open();
                                        Image img = Image.GetInstance(headerImagePath);
                                        if (img != null)
                                        {
                                            img.ScaleToFit(540f, 300f);
                                            pdfDoc.Add(img);
                                        }

                                        HtmlElementHandler htmlElementHandler = new HtmlElementHandler();

                                        XMLWorkerHelper helper = XMLWorkerHelper.GetInstance();
                                        helper.ParseXHtml(htmlElementHandler, inputMemoryStream, Encoding.ASCII);

                                        foreach (IElement ielement in htmlElementHandler.elementList)
                                        {
                                            pdfDoc.Add(ielement);
                                        }

                                        result = "Successfully Created new HTML--> PDF Document!";
                                        pdfWriter.CloseStream = false;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                result = "Exception: " + ex.Message;
            }

            return result;
        }

我得到了和以前一样的结果,就像把所有的东西都塞进pdfDoc一样。

我可以看到,我的元素实际上是一个有内容的iTextShartp.text.pdf.PdfDiv,也许我可以用它做点什么,但我在这里并不是什么专家,我觉得没有爱丽丝来引导我,我就像在兔子洞里一样。

额外的搜索表明有一种方法可以实现获得嵌入的图像,但是我并不那么热衷于为我的图像生成二进制文本图像字符串并像这个解决方案那样将它加载到HTML中。我希望能够根据需要选择和更改图像。我想我可以创建一种方法来拍摄一个图像,创建这个二进制文本,并将它插入到我的HTML中,但是我宁愿先看看是否还有其他的解决方案。

所以,你可以看到我尝试过的。我很感谢你能提供的任何其他帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-26 15:06:52

书中没有提到XML,因为这本书是在2009年编写的,关于XML的开发是在2011年开始的。您的问题很长,但是它缺少一个重要的元素:类似为沙箱实例提供的HTML示例(您没有提到)。例如:当使用thoreau.html解析ParseHtmlImagesLinksOops示例时,我们丢失了所有的图像:oops.pdf;当我们使用ParseHtmlImagesLinks时,我们使用了一个ImageProvider,它确保我们获得了正确的图像路径,结果看起来很好:thoreau.pdf (顺便说一句,链接也是这样)。

然而,当我看到实际的需求时,我看到您想要创建一个带有字母头图像的字母。在这种情况下,我会使用页面事件将公司固定添加到每个页面。这本书解释了如何做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29281040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档