用于 HTML 到 PDF 的 iTextSharp XMLWorkerHelper 和图像

2023-12-08

底线是我正在使用 iTextSharp 将 HTML 写入 PDF --带有图像。现在,我使用的是 iTextSharp 的最新版本,即 5.5.5.0。我可以访问Bruno's书,我正在使用所阐述的方法demo.iTextSupport.com用于转换。很遗憾,the book似乎没有任何参考XMLWorker助手,这就是我用来从 HTML 创建 PDF 的方法。

这是我最终成功从格式良好的 HTML 字符串生成 PDF 的方法:

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 的其余部分却严重截断了输出。

 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 做一些技巧克里斯·哈斯精彩的帖子在这里.

所以,我像 Chris 展示的那样制作了自己的 IElementHandler(除了我做的事情很长,请耐心等待):

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);
                }
            }
        }
    }
}

现在使用这段代码:

 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 中,但我宁愿先看看是否有其他解决方案。

所以,你可以看看我尝试过什么。如果您能提供任何其他帮助,我将不胜感激。


书中没有提到 XML Worker,因为这本书是 2009 年写的,而 XML Worker 的开发是在 2011 年开始的。您的问题很长,但缺少一个重要元素:一个 HTML 示例,如提供的示例这沙箱示例(你没有提到)。例如:当解析梭罗.html示例使用解析Html图像链接Oops,我们丢失所有图像:梭罗_oops.pdf;当我们使用解析Html图像链接,我们使用一个ImageProvider这确保我们获得图像的正确路径,并且结果看起来相当不错:梭罗.pdf(顺便说一下,链接也是如此)。

但是,当我查看实际需求时,我发现您想要创建一封带有图像的信笺作为信头。在这种情况下,我将使用页面事件将公司文具添加到每个页面。书中解释了如何做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于 HTML 到 PDF 的 iTextSharp XMLWorkerHelper 和图像 的相关文章

  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • CSS 过滤器在 Firefox 中不起作用

    我正在尝试 CSS 过滤器 但它在我的 Firefox 15 0 浏览器中不起作用 HTML div class google img src https www google com images srpr logo3w png div
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • CSS以两种颜色显示一个字符[重复]

    这个问题在这里已经有答案了 css中是否可以用两种颜色制作单个字符 我的意思是例如字符 B 上半部分为红色 下半部分为蓝色 h1 font size 72px background webkit linear gradient red 49
  • 如何在 CSS 中将容器内的多个 div 居中

    我正在测试像 Windows Metro 风格的中心分隔线 container height 300px width 70 background EEE margin 10px auto position relative block ba
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • jQuery:向左滑动和向右滑动

    我见过slideUp and slideDown在 jQuery 中 左右滑动的功能 方式怎么样 您可以使用 jQuery UI 中的附加效果来做到这一点 详情请参阅此处 http docs jquery com UI Effects Sl
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html

随机推荐

  • Z3统计:时间衡量什么?

    当使用 st 命令选项运行 Z3 3 1 时 我得到了奇怪的统计结果 如果按 Ctrl C Z3 会报告total time time 总时间 和 时间 衡量什么 这是一个错误 虽然很小 上面描述的差异 Thanks 这是 Z3 for L
  • Android - 无法使用traceview

    我正在尝试使用 Traceview 对 Android 应用程序运行一些分析 我用以下几行包装了我想要跟踪的代码 Debug startMethodTracing xxx code Debug stopMethodTracing 它成功生成
  • 开发者 Chrome 扩展程序:包无效。详细信息:“无法 uzip 扩展”

    我开发了一个 chrome 扩展 我做了一些小更新 突然无法通过 Chrome 网上商店安装扩展程序 我收到错误 Package is in valid Details Could not unzip extension zip 文件似乎有
  • `imshow(someImage, [])` 有什么作用?

    我试图找出第二个 空向量 参数imshow someImage 在Matlab中是为 根据doc imshow 它要么是颜色图 要么是宽度 高度范围 但这些对我来说都没有意义 因为向量是空的 使用空括号 imshow 将显示最小值和最大值之
  • Python OpenCV 2.4 写入半完整的PNG视频帧

    我刚刚在 Ubuntu 12 04 上从源代码安装了 OpenCV 2 4 我正在尝试使用 Python 脚本将视频的第一帧写入 PNG 图像 但我得到了一些奇怪的结果 这是代码 import numpy as np import cv i
  • 多次扩展 Laravel 验证器

    类似于confirmation规则 我正在创建一个基于另一个属性的值的验证规则 据我发现 实现此目的的唯一方法是扩展 Validator 类并通过以下方式获取值 this gt data 文档说扩展验证器然后使用Validator reso
  • 使用 C# 中的 jni4net 连接 JVM 时 Web 应用程序出错

    我正在尝试使用 jni4net 从我的 C web 应用程序内部访问简单的 java 代码 但它抛出了一些错误 生成所有代理和 dll 来访问 java 类 我在 Program cs 文件中编写了与 JVM 连接的代码 后来按习俗java
  • 我可以使用相同的密钥库文件来签署两个不同的应用程序吗?

    我必须上传一个新的应用程序 只是设计有点不同 昨天我生成了密钥库文件来签署应用程序 我可以用同样的吗 你可以用它keystore适用于任意数量的应用程序 无需生成新的密钥库
  • 使用 hazmat 库加载原始公共 EC 密钥

    我有以下使用 JS 生成的私钥和公钥 priv auLHORUBmv5n48jUDA1TskAmJWFi4TFEmjE1GjgjEB8 pub BFvn Qk8HWPwgI5ZgCiWxJV5SYdTXbkVz66sgoEslLxotftR
  • 关于STL线程安全和STL调试的问题

    我有两个关于STL的问题 1 为什么STL不是线程安全的 有没有线程安全的结构 2 如何使用GDB调试STL 在GDB中 如何打印矢量 容器数据结构几乎总是需要同步 例如mutex 阻止竞争条件 由于 C 标准 C 0x 之前 不支持线程
  • 这是将 HTML 放入 PHP 的正确方法吗?

    我是 PHP 新手 大部分时间我都在 回显 我的 HTML 今天 我发现了这种方法 这让事情变得简单了 1000 倍 p HTML can go here without echo ing it p 但这是一种可以接受的方式吗 似乎每次都有
  • 实体框架如何从存储过程创建返回模型?

    我想了解 EF 如何从存储过程创建返回模型 我知道如何获取返回模型 甚至知道如何自定义它 但我找不到任何有关 EF 如何真正从复杂的 SP 获取返回模型的文档或解释 我的意思是 创建模型时是否需要实际运行 SP 我想不是 它怎么知道要使用哪
  • 如何使用 TextMessage 将 XML 文件发送到 JMS 队列?

    Oracle 文档说 TextMessage 对象用于发送包含 java lang String 的消息 它继承了Message接口并添加了文本消息正文 此消息类型可用于传输基于文本的消息 包括具有 XML gt 内容的消息 这怎么可能 X
  • jQuery - 隐藏除第一个元素之外的所有元素

    假设我有 10 个按钮 我想隐藏除第一个按钮之外的所有按钮 我试图使用 jQuery 中的 every 来完成它 但它不起作用 这是我的脚本 这只是一个测试 看看我是否可以获得按钮的索引 没有出现错误 button each functio
  • Facebook好友列表获取

    我想用 php 获取好友列表 我获得了必要的权限 但无法获取朋友列表 范围 gt 电子邮件 用户朋友 user friends facebook gt api me friends result 数据 gt 数组 摘要 gt 数组 tota
  • 在 Python 中对列表中的每个项目进行线程处理

    我有一个清单H item1 item2 item3 so on 和一个函数 def start item1 p1 Do something to item1 return p1 我希望函数 start 应该为列表 H 中的每个项目并行运行
  • 如何更改 searchcontroller 中的 uitextfield 颜色?

    我在导航栏中嵌入了 SearchController 如何将 UITextField 颜色将搜索字符串更改为白色 这将帮助您实现您想要的目标 只需在此代码中应用您的颜色组合即可查看 if available iOS 11 0 let sc
  • 一些表格视图单元具有动态高度,其他具有固定高度

    我有一个桌面视图 我想要一些具有动态高度的表格视图单元格 而其他单元格具有固定高度 对于动态高度 我在 viewDidLoad 视图控制器委托中使用了以下几行 tableView estimatedRowHeight 200 tableVi
  • 如何在 java 中仅使用 java.io.* 将颜色转换为灰度;图书馆?

    好吧 我得到了这个 因为在我这里他们要求这样 好吧我有这个 一些变量和注释是可能的代码 但我的意思是我不知道该怎么做 我在互联网上发现转换R是字节在 0 21中 G是 0 71我猜是蓝色是 0 07 我只能使用该库 java io 我正在处
  • 用于 HTML 到 PDF 的 iTextSharp XMLWorkerHelper 和图像

    底线是我正在使用 iTextSharp 将 HTML 写入 PDF 带有图像 现在 我使用的是 iTextSharp 的最新版本 即 5 5 5 0 我可以访问Bruno s书 我正在使用所阐述的方法demo iTextSupport co