ITextSharp 解析包含图像的 HTML:它解析正确,但不会显示图像

2023-11-21

我正在尝试使用 ITextSharp 库从 html 生成 .pdf。我能够创建 pdf,并将 html 文本转换为 pdf 文本/段落

我的问题:pdf 不显示我的图像(我的imghtml 中的元素)。我所有的img我的 html 中的 html 元素没有显示在 pdf 中? ITextSharp 是否可以解析 HTML 并显示图像。我真的希望如此,否则我就吃饱了:(

我链接到图像所在的正确目录(使用 IMG_BASURL),但它们只是不显示

My code:

// mainContents variable is a string containing my HTML
var document = new Document(PageSize.A4, 50, 50, 80, 100);
var output = new MemoryStream();
var writer = PdfWriter.GetInstance(document, output);
document.open();

Hashtable providers = new Hashtable();
providers.Add("img_baseurl","C:/users/xx/VisualStudio/Projects/myproject/");
var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(mainContents), null, providers);
foreach (var htmlElement in parsedHtmlElements)
   document.Add(htmlElement as IElement);

document.Close();

每次我遇到这个问题时,问题都是图像对于画布来说太大。更具体地说,即使是裸体IMG标签内部将被包裹在Chunk将会被包裹在Paragraph,我认为图像溢出了段落,但我不能 100% 确定。

两个简单的修复方法是放大画布或在 HTML 上指定图像尺寸IMG标签。第三种更复杂的途径是使用额外的提供商IMG_PROVIDER。为此,您需要实施IImageProvider界面。下面是一个非常简单的版本

    public class ImageThing : IImageProvider {
        //Store a reference to the main document so that we can access the page size and margins
        private Document MainDoc;
        //Constructor
        public  ImageThing(Document doc) {
            this.MainDoc = doc;
        }
        Image IImageProvider.GetImage(string src, IDictionary<string, string> attrs, ChainedProperties chain, IDocListener doc) {
            //Prepend the src tag with our path. NOTE, when using HTMLWorker.IMG_PROVIDER, HTMLWorker.IMG_BASEURL gets ignored unless you choose to implement it on your own
            src = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\" + src;
            //Get the image. NOTE, this will attempt to download/copy the image, you'd really want to sanity check here
            Image img = Image.GetInstance(src);
            //Make sure we got something
            if (img == null) return null;
            //Determine the usable area of the canvas. NOTE, this doesn't take into account the current "cursor" position so this might create a new blank page just for the image
            float usableW = this.MainDoc.PageSize.Width - (this.MainDoc.LeftMargin + this.MainDoc.RightMargin);
            float usableH = this.MainDoc.PageSize.Height - (this.MainDoc.TopMargin + this.MainDoc.BottomMargin);
            //If the downloaded image is bigger than either width and/or height then shrink it
            if (img.Width > usableW || img.Height > usableH) {
                img.ScaleToFit(usableW, usableH);
            }
            //return our image
            return img;
        }
    }

要使用此提供程序,只需将其添加到提供程序集合中,就像您所做的那样HTMLWorker.IMG_BASEURL:

providers.Add(HTMLWorker.IMG_PROVIDER, new ImageThing(doc));

应该注意的是,如果您使用HTMLWorker.IMG_PROVIDER你有责任弄清楚关于图像的一切。上面的代码假设所有图像路径都需要在前面添加一个常量字符串,您可能需要更新它并检查HTTP在开始时。另外,因为我们说我们希望完全处理提供者的图像处理管道HTMLWorker.IMG_BASEURL不再需要。

主代码循环现在看起来像这样:

        string html = @"<img src=""Untitled-1.png"" />";
        string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "HtmlTest.pdf");
        using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
            using (Document doc = new Document(PageSize.A4, 50, 50, 80, 100)) {
                using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                    doc.Open();
                    using (StringReader sr = new StringReader(html)) {
                        System.Collections.Generic.Dictionary<string, object> providers = new System.Collections.Generic.Dictionary<string, object>();
                        providers.Add(HTMLWorker.IMG_PROVIDER, new ImageThing(doc));

                        var parsedHtmlElements = HTMLWorker.ParseToList(sr, null,  providers);
                        foreach (var htmlElement in parsedHtmlElements) {
                            doc.Add(htmlElement as IElement);
                        }
                    }
                    doc.Close();
                }
            }
        }

最后一件事,请确保在此处发帖时指定您所针对的 iTextSharp 版本。上面的代码针对 iTextSharp 5.1.2.0,但我认为您可能使用的是 4.X 系列。

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

ITextSharp 解析包含图像的 HTML:它解析正确,但不会显示图像 的相关文章

随机推荐

  • 从集合中删除文件

    我有一个目录 其中包含的文件要么属于构成 Qt 项目的集合 要么包含其他文件 也就是说 文件 A cxx ADriver cxx 和 A ui 都属于需要使用 Qt 选项进行编译的集合 然后我有一个非 qt 的文件 B cxx 然后C cx
  • 重载超类的函数

    C 标准中是否有某些内容阻止我重载超类的函数 从这对类开始 class A super class int x public void foo int y x y original definition class B public A d
  • 我应该对 jQuery 插件的缩小版本进行版本控制吗?

    假设我编写了一个 jQuery 插件并将其添加到我的存储库 在我的例子中为 Mercurial 这是一个单一文件 比如说jquery plugin js 我使用 BitBucket 来管理此存储库 其功能之一是下载页面 所以 我补充一下jq
  • 如何找出touchmove javascript事件的实际event.target?

    我正在尝试在我的 Web 应用程序中开发一个简单的拖放 UI 可以用鼠标或手指拖动项目 然后将其放入多个放置区域之一 当一个项目被拖过放置区域 但尚未释放 时 该区域会突出显示 标记安全着陆位置 这对于鼠标事件来说工作得很好 但我在 iPh
  • PyInstaller 文件大小非常大

    我使用 wxPython 制作了简单的代码编辑器 文件大小 Python 文件 为 1 3 KB 但是当我使用 PyInstaller 创建可执行文件时 我得到30 MB 文件 有没有办法减小文件大小 顺便说一句 我没有导入整个wx库 只有
  • Discord Bot 无法按名称或 ID 找到频道

    我正在尝试使用 DiscordJS 制作一个不和谐机器人 我想获取特定频道 const Discord require discord js var bot new Discord Client var myToken NDQ2OTQ1 v
  • Font-face 在 IE、otf 字体中不起作用

    我知道这个问题被问过多次 但在尝试后我无法让它工作 这是我用来导入自定义字体的简单 CSS 另外 我将其与引导程序一起使用 font face font family Montserrat Black src url Montserrat
  • 在成员函数内的 lambda 捕获列表中使用数据成员

    以下代码可以使用 gcc 4 5 1 进行编译 但不能使用 VS2010 SP1 进行编译 include
  • 退出 Smarty 以手动执行

    我面临的问题是 我不太确定如何在没有框架或模板引擎的情况下进行开发 我开始以这种方式编码 现在我想学习基础知识 我曾经使用过这种 MVC 模式 使用 Codeigniter 和 Smarty 作为模板引擎 我现在想做的是使用原始 php 而
  • 从远程 ssh 存储库进行 Git 克隆 - 在执行克隆命令之前更改远程网络上的机器

    我想将 git 存储库从我公司的服务器克隆到我的个人计算机 从 外部 访问这些服务器的唯一方法是通过 ssh 登录到 machine1 ssh email protected 不幸的是 git 没有安装在该特定机器上 所以像这样的 git
  • 如何提取

    标签之间的文本

    我想从 HTML 页面中提取文本p and li标签 这样我就可以开始对页面进行标记 为每个页面构建倒排索引 以便回答搜索查询 我怎样才能得到p使用 jsoup 的标签 Elements e doc select 该参数中要写入的字符串是什
  • 传递数据帧以在函数内进行变异

    我想传递一个数据框及其列 以供函数内的 dplyr 的 mutate 处理 这是一个例子 multifun lt function dataf vari mutate dataf newvar vari 2 multifun mtcars
  • 在 Haskell 中设置 argv[0]?

    有没有办法设置argv 0 在 Haskell 程序中 例如 用 ghc 编译的程序 我找到了getProgName and withProgNameSystem Environment 中的函数 但它似乎没有改变什么ps报告 Ubuntu
  • QComboBox AbstractItemView::item

    有没有办法可以增加 QComboBox 控件中列出的项目的高度 我尝试按照此处的建议进行操作在 QTDevNet 论坛中但没有运气 QComboBox QAbstractItemView item margin top 3px 我也尝试过这
  • 将 numpy 类型转换为 python

    我有一个从 pandas 生成的以下形式的字典列表 我想把它转换成json格式 list val 1 0 685 2 0 8 output json dumps list val 但是 json dumps 抛出错误 TypeError 6
  • PHP:如何使用 smtp 设置发送带有附件的电子邮件?

    我使用以下代码成功发送电子邮件 但现在我想在电子邮件中附加一个文本文件 例如 test txt 任何想法 require once Mail php from Usman lt email protected gt to Naveed lt
  • 具有 byte[] 字段作为存储过程参数的 DataTable

    我一直在重复使用这种使用 DataTable 作为存储过程参数的方法 并且效果很好 这是简化的工作代码 using dbEntities dbe new dbEntities var dt new dataTable dt Columns
  • 使用 OpenCV fitEllipse() 进行圆拟合

    使用OpenCV是否有效拟合椭圆用于圆拟合 fitEllipse 返回cv RotatedRect如何平均宽度和高度来获得拟合的圆半径 我认为使用的 有效性 cv fitEllipse拟合圆取决于您所需的拟合精度 例如 您可以在测试集上运行
  • HTMLCanvasElement 上未解决的方法 captureStream

    我的画布元素和方法有奇怪的情况captureStream 根据文档 HTMLCanvasElement 有一个方法captureStream 然而我的 Angular6 应用程序声称没有这样的方法 所以这段代码将不起作用 let canva
  • ITextSharp 解析包含图像的 HTML:它解析正确,但不会显示图像

    我正在尝试使用 ITextSharp 库从 html 生成 pdf 我能够创建 pdf 并将 html 文本转换为 pdf 文本 段落 我的问题 pdf 不显示我的图像 我的imghtml 中的元素 我所有的img我的 html 中的 ht