首页 文章

用PHP将HTML CSS转换为PDF? [关闭]

提问于
浏览
1459

我有一个HTML(不是XHTML)文档,可以在Firefox 3和IE 7中呈现 . 它使用相当基本的CSS来设置它并在HTML中呈现得很好 .

我现在正在采用将其转换为PDF的方法 . 我试过了:

  • DOMPDF:表格存在很大问题 . 我考虑了我的大型嵌套表并且它有所帮助(在它消耗高达128M的内存然后死亡之前 - 这是我对php.ini中的内存的限制)但是它使得表完全混乱并且似乎没有得到图片 . 这些表只是一些基本的东西,有一些边框样式可以在不同的点添加一些线条;

  • HTML2PDF and HTML2PS:我其实运气好了 . 它呈现了一些图像(所有图像都是谷歌图表URL),表格格式要好得多,但它似乎有一些复杂性问题,我还没有想到,并且因为未知的node_type()错误而死亡 . 不知道从哪里开始;和

  • Htmldoc:这似乎在基本HTML上运行良好,但几乎不支持CSS,所以你必须用HTML做所有事情(我没有对我没用 .

我尝试了一个名为Html2Pdf Pilot的Windows应用程序实际上做了相当不错的工作,但我需要的东西至少在Linux上运行,理想情况下通过Web服务器上的PHP按需运行 .

我错过了什么,或者我该如何解决这个问题?

30 回答

  • 2

    尝试 grab 最新的夜间 dompdf 构建 - 我使用的是旧版本,这是一个非常糟糕的资源,并且永远用于渲染我的PDF格式 . 从here每晚抓到一个 .

    生成PDF只需要几秒钟 - 而且它与 PrinceXML / Docraptor 一样精确渲染 . 好像他们自从我上次使用它以来已经认真优化了 dompdf 代码!

  • 638

    经过一些调查和一般的拔毛,解决方案似乎是HTML2PDF . DOMPDF做了一个糟糕的工作,表格,边框,甚至是中等复杂的布局,htmldoc似乎相当健壮,但几乎完全是CSS无知的,我不想回到没有CSS只为该程序做HTML布局 .

    HTML2PDF看起来最有希望,但我一直有关于node_type的空引用参数的这个奇怪的错误 . 我终于找到了解决方案 . 基本上,PHP 5.1.x在任何大小的字符串上使用正则表达式替换(preg_replace_ *)都能正常工作 . PHP 5.2.1引入了一个名为 pcre.backtrack_limit 的php.ini配置指令 . 此配置参数的作用是限制完成匹配的字符串长度 . 为什么这是介绍我不知道 . 默认值选择为100,000 . 为什么这么低的 Value ?再一次,不知道 .

    A bug was raised against PHP 5.2.1 for this,差不多两年后仍然开放 .

    令人恐惧的是,当超过限制时,只需更换 silently fails . 至少如果出现错误并记录错误,您就会知道发生了什么,为什么以及要修改什么来修复它 . 但不是 .

    所以我有一个70k的HTML文件变成PDF . 它需要以下php.ini设置:

    • pcre.backtrack_limit = 2000000; #可能比我需要的还多,但没关系

    • memory_limit = 1024M; #yes, one gigabyte ;和

    • max_execution_time = 600; #yes, 10 minutes .

    现在精明的读者可能已经注意到我的HTML文件小于100k . 我可以猜到为什么我遇到这个问题的唯一原因是html2pdf转换为xhtml作为过程的一部分 . 也许这让我过去了(虽然近50%的膨胀看起来很奇怪) . 无论如何,上述工作都有效 .

    现在,html2pdf是一种资源匮乏 . 我的70k文件需要大约5分钟和至少500-600M的RAM才能创建35页的PDF文件 . 不幸的是,实时下载速度不够快(到目前为止)并且内存使用率使内存使用率大约为1000比1(700k文件的RAM为600M),这完全是荒谬的 .

    不幸的是,这是我提出的最好的 .

  • 25

    Web API

    如果有人总是搜索这种东西,有一个 free 网站,允许您将HTML代码和页面转换为PDF格式 . 还有一个(非常小的)api,允许你从url获取pdf文件 .

    Check it here

  • 6

    也许您可以在将文件传递给转换器之前尝试使用Tidy . 如果其中一个渲染器在某些HTML问题上窒息(如未关闭的标记),则可能有所帮助 .

  • 4

    精细渲染并不意味着什么 . 它有效吗?

    无论输入多么糟糕,所有浏览器都会尽最大努力在屏幕上显示内容 . 当然,他们不会做同样的事情 . 如果你想要与FireFox相同的渲染,你可以使用它的渲染引擎 . 有pdf生成器 . 不过,这是一项非常多的工作 .

  • 5

    我按顺序推荐TCPDF或DOMPDF .

  • 63

    我开发了一个公共API来从网页构建PDF文件 . 它有一个很好的PHP客户端类,使它非常易于使用 . 它使用wkhtmltopdf在 Cloud 中呈现PDF .

    不需要HTML中的任何特殊内容 . 不需要绝对的images / css / js链接中的URLS . 也适用于localhost(开发机器) .

    目前,该服务在4个Azure区域设有终端:美国东部,美国西部,欧盟北部,东南亚 .

    它很快,因为它使用专有协议将网页内容发送到API以转换为PDF .

    它是可靠的,因为所有 endpoints 都是负载 balancer 的 .

    免费帐户可用于测试或低使用率 . 网站上的详细信息:

    https://rotativahq.com

  • 5

    Darryl Hein上面提到TCPDF可能是一个好主意 . Nicola Asuni 's code is pretty handy and powerful. The only killer is if you ever plan on merging PDF files with your generated PDF it doesn' t有这些功能 . 您必须创建PDF,然后使用Sid Steward(www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)的PDFTK合并它 .

  • 3

    Important: 请注意,这个答案是在2009年写的,它可能不是2018年的最具成本效益的解决方案 . 今天的在线替代品比当时更好 .

    以下是一些您可以使用的在线服务:


    看看PrinceXML .

    它绝对是最好的HTML / CSS到PDF转换器,虽然它不是免费的(但是,嘿,你的编程可能也不是免费的,所以如果它可以节省你10个小时的工作,你就可以免费回家了(因为你还需要考虑到替代解决方案将要求您使用正确的软件设置专用服务器)

    哦是的,我是否提到过这是第一个(也可能是唯一的)完全ACID2的HTML2PDF解决方案?

    PrinceXML Samples

  • 7

    不是 PHP ,而是Java library,它做了这件事:

    Flying Saucer采用XML或XHTML并将CSS 2.1兼容的样式表应用于它,以便渲染为PDF

    它可以从 PHP 通过 system() 或类似的调用使用 . 虽然它需要 XML 良好的形成 input .

  • 118

    它已被提及,但我想确认mpdf是最简单,最强大,最免费的html到pdf转换器 . 天空真的是极限 . 您甚至可以生成动态的,用户生成的数据的pdf .

    例如,客户想要一个CMS系统,这样他就可以更新他在俱乐部演奏的音乐的曲目列表 . 这没问题,但他也希望用户能够下载播放列表的.pdf,所以这个可下载的pdf也必须由cms更新 . 感谢mpdf,有一些简单的循环和散布的变量,我可以做到这一点 . 我认为会花费数周时间的东西花了我几分钟 .

    伟大的article帮助我开始了 .

  • 12

    虽然已经提供了很多解决方案,但我推荐以下两个:

    • HTM2PDF - 提供了一个将HTML转换为PDF的API,还有一个PHP SDK,这使得在PHP中实现它非常容易;它提供欧洲,亚洲和美国的服务器位置选择

    • PDFmyURL - 提供了一个API,它可以将URL和HTML格式化为PDF,具有与HTM2PDF大致相同的功能,但可以在负载 balancer 的环境中工作,并且需要更长的时间

    与前面提到的所有解决方案中的这两个API不同的是,除了使用CSS和JavaScript将HTML转换为PDF之外,它还提供PDF权限管理,水印和加密 . 因此,对于那些想要立即投入使用的人来说,这是一个一体化的解决方案 .

    免责声明:我为Kaiomi工作,这是一家经营这两个网站的公司 .

  • 21

    就成本而言,在许多情况下使用Web服务(API)可能是更明智的方法 . 此外,通过外包此流程,您可以减轻自己的基础架构/后端负担 - 并且 - 如果您使用的是信誉良好的服务 - 请确保兼容调整Web标准,正常运行时间,缩短处理时间和快速交付内容 .

    我已经对目前市场上的大多数Web服务进行了一些研究,请在下面找到我认为值得一提的API,基于价格/ Value 比的订单 . 他们都提供预先组成的PHP类和包 .

    Quality:

    拥有高品质的引擎 PrinceXML 作为支柱,DocRaptor显然提供最佳的PDF质量,返回高度抛光和转换良好的PDF文档 . 但是,pdflayer API服务在这里非常接近 . Pdfcrowd不一定按质量得分,而是加工速度 .

    Cost:

    pdflayer.com - 如上所述,这里最具成本效益的选择是pdflayer.com,提供100个月度PDF和高级订阅的完全免费订阅计划,范围在9.99美元至119.99美元之间 . 10,000份月度PDF文件的价格为39.99美元 .

    docraptor.com - 提供7天免费试用期 . 高级订阅计划的价格从15美元到2250美元不等 . 10,000份月度PDF文件的价格约为300.00美元 .

    pdfcrowd.com - 免费提供100个PDF文件 . 高级订阅计划价格从9美元到89美元不等 . 10,000份月度PDF文件的价格约为49.00美元 .

    我已经使用了所有这三个,这个文本应该帮助任何人决定,而不必支付所有这些 . 本文未用于支持任何一种产品,我与任何产品没有任何关系 .

  • 13

    TCPDF工作正常,没有依赖关系,是免费的,并且经常被修复 . 如果提供的HTML / CSS内容格式良好,则速度合理 . 我通常生成50 - 300 kB的HTML输入(包括CSS),并在1-3秒内获得PDF输出,包含10 - 15个PDF页面 .

    我强烈建议在向TCPDF发送任何内容之前使用 tidy 库作为HTML漂亮的格式化程序 .

  • 13

    只是为了碰撞线程,我've tried DOMPDF and it worked perfectly. I'已经使用了 DIV 和其他块级元素来定位所有内容,严格保持CSS 2.1并且它很好地播放了veru .

  • 9

    HTML到PDF转换真的需要使用PHP在服务器端进行吗?

    我刚刚遇到jsPDF,一个使用HTML5 / JavaScript的客户端解决方案 . 麻省理工学院授权的code is on GitHub也是 .

  • 6

    你为什么不试试mPDF version 2.0?我用它来创建PDF文档 . 它工作正常 .

    与此同时,mPDF版本为5.7,与HTML2PS / HTML2PDF相比,它是主动维护的

    但请记住,文档真的很难处理 . 例如,看一下这个页面:https://mpdf.github.io/ .

    可以使用此库完成围绕html到pdf的非常基本的任务,但更复杂的任务需要一些时间来阅读和“理解”文档 .

  • 9

    我试过了 . 在我看来TCPDF库是最好的折衷性能/可用性 . 安装和使用非常简单,在小型介质应用中也具有良好的性能 . 如果您需要高性能和非常大的PDF文档,请使用Zend_PDF模块,但要准备好编码!

  • 18

    这个问题已经很老了,但没有看到有人提到CutyCapt所以我会:)

    CutyCapt

    CutyCapt是一个小型跨平台命令行实用程序,用于捕获WebKit将网页呈现为各种矢量和位图格式,包括SVG,PDF,PS,PNG,JPEG,TIFF,GIF和BMP

  • 22

    结帐TCPDF . 它有一些HTML到PDF功能,可能足以满足您的需求 . 它也是免费的!

  • 29

    Good news! Snappy!!

    Snappy是一个 very easy 开源PHP5库,允许从url或html页面生成缩略图,快照或PDF . 并且...它使用 excellent 基于webkit的 wkhtmltopdf

    请享用! ^ _ ^

  • 142

    看看wkhtmltopdf . 它是开源的,基于webkit和免费 .

    我们写了一个小教程here .

    EDIT( 2017 ):

    如果今天要建造一些东西,我就不会再去那条路了 .
    但是会使用http://pdfkit.org/代替 .
    可能会剥夺其所有nodejs依赖项,以便在浏览器中运行 .

  • 475

    如果您可以访问命令行,则可以使用 PhantomJSURL (远程或本地)创建 PDF .

    它工作得很好,是一个免费的解决方案 .

    看看这个针对这个问题的example脚本 .

  • 27

    我建议 DocRaptor (使用 PrinceXML 作为"engine")

  • 19

    有's a tutorial on Zend'的devzone从php(part 1part 2)生成pdf而没有任何外部库 . 我从来没有实现过这种解决方案,但由于它都是php,你可能会发现实现和调试更加灵活 .

  • 53

    最初在开场帖中提到的 HTML2PDF and HTML2PS 正在讨论2009年的一揽子计划link

    但是有一个更好的HTML2PDF

    它基于TCPDF,但部分是法语 .

    您可以在页面上重复使用表格页眉或页脚,并具有页码和总页数 . 见its examples . 我已经使用它超过三年并推荐它 .

  • 13

    我正在使用fpdf使用PHP生成PDF文件 . 到目前为止,它对我来说很有效,可以产生简单的输出 .

  • 26

    1)使用MPDF!

    a)在 yourfolder 中提取

    b)在 yourfolder 中创建 file.php 并插入此类代码:

    <?php
    include('../mpdf.php');
    $mpdf=new mPDF();
    $mpdf->WriteHTML('<p style="color:red;">Hallo World
    Fisrt sentencee</p>'); $mpdf->Output(); exit; ?>

    c)从浏览器中打开 file.php

    2)使用pdfToHtml!

    1)将 pdftohtml.exe 解压缩到您的根文件夹:

    2)在该文件夹内,在 anyfile.php 文件中,输入此代码(假设,还有一个源example.pdf):

    <?php
    $source="example.pdf";
    $output_fold="FinalFolder";
    
        if (!file_exists($output_fold)) { mkdir($output_fold, 0777, true);}
    $result= passthru("pdftohtml $source $output_fold/new_filename",$log);
    //var_dump($result); var_dump($log);
    ?>
    

    3)输入 FinalFolder ,并且会有转换后的文件(因为源PDF已经有多少页...)

  • 9

    我不认为php类最适合用css渲染xHtml页面 .

    当新的css规则问世时会发生什么? (很快css 3.0 ...)

    渲染html页面的最佳方法是obvisiuly,一个浏览器 . Firefox 3.0可以原生地以pdf格式'print',torisugary开发了一个扩展(命令行打印)来使用它 . Here you'll find it.

    无论如何,还有很多问题只是作为一个PDF转换器运行firefox ...

    目前,我认为wkhtmltopdf是最好的(这是safari浏览器使用的那个),快速,快速,真棒 . 是的,开源也是...... Give it a look

  • 11

    好吧,如果你想要找到一个完美的XHTML CSS到PDF转换库,算了吧 . 这远非可能 . 因为它就像找到一个完美的浏览器(XHTML CSS渲染引擎) . 我们有吗? IE或FF?

    我在DOMPDF上取得了一些成功 . 问题是你必须修改HTML CSS代码以适应库的工作方式 . 除此之外,我有很好的结果 .

    见下文:

    Original HTML

    Converting HTML to PDF

相关问题