草庐IT

c# - 在 .NET 中将 HTML 转换为 PDF

coder 2023-04-23 原文

我想通过将 HTML 内容传递给函数来生成 PDF。我为此使用了 iTextSharp,但它在遇到表格时表现不佳并且布局变得困惑。

有没有更好的办法?

最佳答案

编辑:新建议 HTML Renderer for PDF using PdfSharp

(在尝试 wkhtmltopdf 并建议避免之后)

HtmlRenderer.PdfSharp 是 100% 完全 C# 托管代码易于使用,线程安全,最重要的是 免费 ( New BSD License ) 解决方案。

用法

  1. 下载 HtmlRenderer.PdfSharp nuget 包。
  2. 使用示例方法。

    public static Byte[] PdfSharpConvert(String html)
    {
        Byte[] res = null;
        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }
        return res;
    }
    

非常好的替代品Free VersioniTextSharp

直到 4.1.6 版 iTextSharp 在 LGPL 许可下获得许可,并且直到 4.16 版(或者可能还有 fork )都可以作为包提供并且可以免费使用。当然有人可以用续5+ paid version .

我尝试在我的项目中集成 wkhtmltopdf 解决方案,但遇到了很多障碍。

出于以下原因,我个人会避免在托管企业应用程序上使用 wkhtmltopdf - based 解决方案。

  1. 首先,wkhtmltopdf 是 C++ 实现的,而不是 C#,你会 将其嵌入到 C# 代码中时遇到各种问题, 尤其是在您的 32 位和 64 位版本之间切换时 项目。不得不尝试几种解决方法,包括有条件的 项目 build 等只是为了避免“无效格式异常” 在不同的机器上。
  2. 如果您管理自己的虚拟机,也可以。但是如果你的项目 在受限环境中运行,例如 (Azure (实际上用天蓝色是不可能的,如 TuesPenchin 作者) , Elastic Beanstalk 等)配置该环境仅让 wkhtmltopdf 工作是一场噩梦。
  3. wkhtmltopdf 正在您的服务器中创建文件,因此您必须 管理用户权限并授予对 where 的“写入”访问权限 wkhtmltopdf 正在运行。
  4. Wkhtmltopdf 作为一个独立的应用程序运行,所以它的 不是 由您的 IIS 应用程序池管理。所以你必须要么托管它 作为另一台机器上的服务,否则您将在生产中遇到处理峰值和内存消耗 服务器。
  5. 它使用临时文件来生成 pdf,在某些情况下像 AWS EC2 的磁盘 i/o 非常慢,这是一个很大的性能 问题。
  6. 最讨厌的“无法加载DLL‘wkhtmltox.dll’”报错 许多用户。

--- 预编辑部分 ---

对于任何想在更简单的应用程序/环境中从 html 生成 pdf 的人,我将我的旧帖子留作建议。

TuesPechkin

https://www.nuget.org/packages/TuesPechkin/

或特别适用于 MVC Web 应用程序 (但我认为您可以在任何 .net 应用程序中使用它)

Rotativa

https://www.nuget.org/packages/Rotativa/

他们都利用 wkhtmtopdf用于将 html 转换为 pdf 的二进制文件。它使用 webkit 引擎来渲染页面,因此它也可以解析 css 样式表

它们提供易于使用的与 C# 的无缝集成。

Rotativa 还可以从任何 Razor View 直接生成 PDF。

此外,对于现实世界的 Web 应用程序,它们还管理线程安全等...

关于c# - 在 .NET 中将 HTML 转换为 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/564650/

有关c# - 在 .NET 中将 HTML 转换为 PDF的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  6. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  7. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  8. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  9. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  10. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

随机推荐