pdf-generation html转pdf - 使用PHP将HTML+CSS转换为PDF?




(25)

Web API

如果有人总是搜索这种东西,有一个免费的网站,允许您将HTML代码和网页转换为PDF。 还有一个(很小)的api,它允许你从url获得pdf文件。

在这里检查

好的,我现在正在用这个砖头撞墙。

我有一个在Firefox 3和IE 7中呈现良好的HTML(不是XHTML)文档。它使用相当基本的CSS来设置它的样式,并且在HTML中呈现良好。

我现在正在将它转换为PDF。 我努力了:

  • DOMPDF :它有很多表格问题。 我分解了我的大型嵌套表,并且它有所帮助(在它耗尽高达128M的内存然后死去之前 - 这是我在php.ini中对内存的限制),但它使得表格变得非常混乱,似乎并没有得到图片。 这些表只是基本的东西,有些边框样式可以在不同的点添加一些线条;
  • HTML2PDF和HTML2PS :我其实有更好的运气。 它呈现了一些图像(所有图像都是谷歌图表网址),表格格式更好,但它似乎有一些复杂性问题,我还没有弄清楚,并且一直伴随着未知的node_type()错误。 不知道该从哪里出发; 和
  • Htmldoc :这对于基本的HTML似乎工作得很好,但几乎不支持CSS,所以你必须用HTML做所有事情(我没有意识到它仍然是2001年在Htmldoc-land中),所以对我来说是没用的。

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

我真的不敢相信我会陷入困境。 我错过了什么吗?


那么如果你想找到一个完美的XHTML + CSS到PDF转换器库,忘记它。 这远非可能。 因为它就像找到一个完美的浏览器(XHTML + CSS渲染引擎)。 我们有吗? IE还是FF?

我在DOMPDF方面取得了一些成功。 问题是你必须修改你的HTML + CSS代码才能使用图书馆的工作方式。 除此之外,我有很好的结果。

见下文:

原始HTML

将HTML转换为PDF


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

我已经对目前市场上的大多数Web服务进行了一些研究,请根据价格/价值比率订购下面的API,我觉得这些API值得一提。 他们都提供预先编写的PHP类和包。

  1. pdflayer.com - 费用:$ - 质量:☆☆☆☆
  2. docraptor.com - 费用:$$$ - 质量:☆☆☆☆☆
  3. pdfcrowd.com - 成本:$$ - 质量:☆☆☆

质量:

拥有高质量的引擎PrinceXML作为骨干, DocRaptor明显提供了最好的PDF质量,返回了高度精练和良好转换的PDF文档。 但是,这里的pdflayer API服务非常接近。 Pdfcrowd不一定以质量评分,但是处理速度很快。

成本:

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

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

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

我已经使用了他们全部三个,并且这个文本应该可以帮助任何人决定而不必为所有人付费。 本文没有被写入认可任何一种产品,我也没有与任何产品有关联。


精细的渲染并不意味着什么。 它是否验证?

无论输入有多糟糕,所有浏览器都尽可能在屏幕上显示某些内容。 当然,他们不会做同样的事情。 如果你想和FireFox一样的渲染,你可以使用它的渲染引擎。 有它的pdf生成器。 虽然这是一项非常多的工作。


没有任何外部库,Zend的devzone有一个关于从php生成pdf的教程( 第1 部分第2部分 )。 我从来没有实现这种解决方案,但因为它都是PHP,所以您可能会发现它更加灵活,可以实现和调试。


我建议DocRaptor (使用PrinceXML作为“引擎”)


重要提示:请注意,这个答案是在2009年编写的,它可能不是当今2018年最具成本效益的解决方案。浏览器和其他开源渲染器在这方面比现在好得多。

看看PrinceXML

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

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

PrinceXML示例


也许你可以在将文件交给转换器之前尝试使用Tidy。 如果其中一个渲染器在某个HTML问题(比如未封闭的标记)上窒息,它可能会有所帮助。


我不认为一个PHP类将是用CSS呈现xHtml页面的最佳选择。

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

显而易见,呈现html页面的最佳方式是浏览器。 Firefox 3.0可以本地“打印”为pdf格式,torisugary开发了一个扩展(命令行打印)来使用它。 在这里你会找到它。

无论如何,仍然有许多问题runninr firefox 只是作为一个PDF转换器...

目前,我认为wkhtmltopdf是最好的(这是Safari浏览器使用的),快速,快速,真棒。 是的,开源,以及... wkhtmltopdf


Darryl Hein提到的TCPDF可能是一个好主意。 Nicola Asuni的代码非常方便和强大。 唯一的杀手锏就是如果你打算将PDF文件与你生成的PDF合并,它就没有这些功能。 您必须创建PDF,然后使用Sid Steward的PDFTK(www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)将其合并。


1)使用MPDF

a)在您的文件yourfolder提取

b)在你的文件yourfolder创建file.php并插入这样的代码:

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

c)从浏览器打开file.php




2)使用pdfToHtml

1)将pdftohtml.exe解压到根文件夹中:

2)在该文件夹内,在anyfile.php文件中,放置这个代码(假设,也有一个source 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一样)


我推荐TCPDF或DOMPDF,是这样的顺序


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

我们here写了一个小教程。

编辑(2017):

如果今天要建造一些东西,我就不会再走这条路了。
但会改用http://pdfkit.org/
可能剥离它的所有nodejs依赖关系,以在浏览器中运行。


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

我强烈建议在将任何内容发送到TCPDF之前,使用整洁的库作为HTML格式化程序。


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

在HTML中不需要特别的东西。 在images / css / js链接中不需要绝对的URL。 也在localhost(开发机器)上工作。

目前该服务在4个Azure地区提供终端服务:美国东部,美国西部,欧盟北部,东南亚。

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

这是可靠的,因为所有端点都是负载平衡的。

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

https://rotativahq.com


最初在开篇中提到的HTML2PDF和HTML2PS正在谈论2009年的一个包裹,这个包裹现在已经断开

但是有一个更好的HTML2PDF

它基于TCPDF,尽管它部分用法语。

您可以在页面上重复使用表格页眉或页脚,并具有页码和总页数。 看看它的例子 。 我已经使用了三年多,并推荐它。


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

CutyCapt

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


HTML to PDF转换是否真的需要使用PHP在服务器端进行?

我刚刚遇到了jsPDF ,这是一个使用HTML5 / JavaScript的客户端解决方案。 麻省理工学院许可的代码也在GitHub上


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

  1. HTM2PDF - 提供了一个将HTML转换为PDF的API,并且还提供了PHP SDK,这使得在PHP中实现起来非常简单; 它提供了欧洲,亚洲和美国的服务器选择
  2. PDFmyURL - 提供了一个API,可以将URL和HTML格式转换为PDF格式,其功能与HTM2PDF大致相同,但在负载均衡的环境中工作并且时间稍长

这两个API与前面提到的所有解决方案都有所不同,除了使用CSS和JavaScript将HTML转换为PDF之外,它还提供PDF版权管理,水印和加密。 因此,对于那些想要在地面运行的人来说,这是一种全面的解决方案。

免责声明:我为运营这两个网站的公司工作。


经过一些调查和一般的拉动解决方案似乎是HTML2PDFDOMPDF在表格,边界和适度复杂的布局方面做htmldochtmldoc看起来相当健壮,但几乎完全是CSS,并且我不想回到没有CSS的情况下为HTML htmldoc程序。

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

PHP 5.2.1针对此问题提出了一个漏洞,漏洞 几乎在两年后才开放。

有什么可怕的是,当超过限制时,替换只是默默地失败 。 至少如果提出并记录了一个错误,你会发现发生了什么事情,为什么要修改它以及如何修改它。 但不是。

所以我有一个70k的HTML文件转换为PDF。 它需要以下php.ini设置:

  • pcre.backtrack_limit = 2000000; #可能比我需要的多,但没关系
  • memory_limit = 1024M; #是, 一千兆字节 ; 和
  • max_execution_time = 600; #是的, 10分钟

现在精明的读者可能已经注意到我的HTML文件小于100k。 我可以猜测出为什么我遇到这个问题的唯一原因是,html2pdf将转换为xhtml作为过程的一部分。 也许这让我感到厌倦(尽管近50%的人看起来很奇怪)。 无论如何,上述工作。

现在,html2pdf是一个资源管理器。 我的70k文件大约需要5分钟,至少需要500-600M的RAM才能创建35页的PDF文件。 不幸的是,由于实时下载不够快,存储器使用率使内存使用率达到1000比1(对于70k文件,内存使用量为600M),这是非常荒谬的。

不幸的是,这是我所想到的最好的。


我正在使用fpdf来使用php生成pdf文件。 到目前为止,它对我来说工作很好,可以生成简单的输出。


不是PHP ,而是一个Java ,它执行以下任务:

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

它可以从PHP通过system()或类似的调用使用。 尽管它需要input XML格式良好。


我为PHP尝试了很多不同的库。 所有列出的我都试过了。 在我看来, TCPDF库是最好的折中性能/可用性。 安装和使用非常简单,在小型媒体应用中也有很好的性能。 如果您需要高性能和非常大的PDF文档,请使用Zend_PDF模块,但要准备好编码!


好消息! Snappy

Snappy是一个非常简单的开源PHP5库,允许从url或html页面生成缩略图,快照或PDF。 而且......它使用了优秀的基于webkit的wkhtmltopdf

请享用! ^ _ ^


用div包装单元格的内容,你可以做任何你想做的事情,但你必须将每个单元格包装在一列中以获得统一的效果。 例如,要获得更宽的左右边距:

所以CSS将是,

div.cellwidener {
  margin: 0px 15px 0px 15px;
}
td.tight {
  padding: 0px;
}
<table border="0">
  <tr>
    <td class="tight">
      <div class="cellwidener">My content</div>
    </td>
  </tr>
</table>

是的,这很麻烦。 是的,它适用于IE。 事实上,我只是用IE测试过这个,因为这是我们允许在工作中使用的全部内容。





php html css pdf pdf-generation