ホームページ > バックエンド開発 > PHPチュートリアル > PHP で HTML コンテンツを含むテキストから画像を生成する方法について説明します。

PHP で HTML コンテンツを含むテキストから画像を生成する方法について説明します。

WBOY
リリース: 2016-06-20 12:42:58
オリジナル
1321 人が閲覧しました

例:

 <div>        <font color="red">文字信息</font><br>        <font>换行</font> </div>
ログイン後にコピー


このような HTML コードの形式を維持して画像を生成する方法


ディスカッションへの返信 (解決策)

考えられる既製の方法:
1. Java の html2image を使用します
2. TCPDF を使用して PDF を生成します。
3. PHP のスクリーンショット関数 imagegrabscreen と imagegrabwindow を使用します

1 つ追加します
https://zh.wikipedia.org/wiki/Webkit
https://en.wikipedia.org/wiki/Webkit

上の階の接続にアクセスできません

dompdf を使用することもできます
まず、define('DOMPDF_PDF_BACKEND', 'gd' ); 画像を生成

「アクセスできません」 233 の表現をさせてください...

えっと、どういう意味ですか?

define('DOMPDF_PDF_BACKEND', 'gd');require_once("dompdf_config.inc.php");$html =<<< HTML<meta http-equiv="Content-Type" content="text/html; charset=gbk"><div>        <font color="red">文字信息</font><br>        <font>换行</font> </div>HTML;$dompdf = new DOMPDF();$dompdf->load_html($html);$dompdf->render();$dompdf->stream('');
ログイン後にコピー
ログイン後にコピー

dompdf ダウンロード アドレス
http://code.google.com/p/dompdf/downloads/list

define('DOMPDF_PDF_BACKEND', 'gd');require_once("dompdf_config.inc.php");$html =<<< HTML<meta http-equiv="Content-Type" content="text/html; charset=gbk"><div>        <font color="red">文字信息</font><br>        <font>换行</font> </div>HTML;$dompdf = new DOMPDF();$dompdf->load_html($html);$dompdf->render();$dompdf->stream('');
ログイン後にコピー
ログイン後にコピー


モデレータに質問しています。ローカルで試しましたが、なぜ生成された画像が表示されず、エラー プロンプトも表示されなかったのですか

dompdf のバージョンが異なると、内容も異なります。パフォーマンス (私のものは dompdf.php、v 1.24 2009-04-29)
HTML を解析するために DOMDocument を使用します
print_r($dompdf->_xml);
解析が正常かどうかを確認できます

dompdf のバージョンが異なると、パフォーマンスも異なります (私のバージョンは dompdf.php、v 1.24 2009-04-29)
HTML を解析するために DOMDocument を使用します
print_r($dompdf- > _xml);
解析が正常かどうかを確認できます



エラー メッセージが表示されます
致命的なエラー: G:AppServwww61.php の保護プロパティ DOMPDF::$_xml にアクセスできません16 行目

php のバージョンは何ですか?

_xml 属性は確かに保護モードです
dompdf.cls.php
class DOMPDF {
protected $_xml; がありますが、php5.4.12 にはまだあります。
DOMPDF Object
(
[_xml:protected] => DOMDocument Object
(
[doctype] =>(オブジェクト値省略)
....

パブリック モードに変更できます

熱心な回答をしてくれたモデレーターに感謝します

私の php バージョンは PHP バージョン 5.2.6 です

ダウンロードした dompdf は @version $ Id です: dompdf.cls.php 468 2012-02-05 10:51:40Z fabien.menager は最新のはずです

php のバージョンは何ですか?

_xml 属性は確かに保護モードです。 php5.4.12 では
class DOMPDF {
protected $_xml;

ですが、
DOMPDF Object
(
[_xml:protected] => DOMDocument) Object
(
[doctype] => (オブジェクト値は省略)
.... パブリック モード


XML を public に変更しましたが、エラーが表示されます

DOMDocument Object ( )

警告: ヘッダー情報は変更できません - ヘッダーは G:AppServwww6includegd_adapter.cls.php の 736 行目で既に送信されています (出力は G:AppServwww61.php:16 で開始されました)

警告: ヘッダー情報は変更できません - ヘッダーはすでに G :AppServwww6includegd_adapter.cls.php の 751 行目 (G:AppServwww61.php:16 で開始された出力) によって送信されています

看样子是对ssl 也下手了,去掉http后的s应该能访问,webkit也不是什么关键词
http://zh.wikipedia.org/wiki/Webkit
http://en.wikipedia.org/wiki/Webkit

不过 PHP 好像也没webkit

http://www.phpclasses.org/package/7460-PHP-Convert-HTML-to-PDF-using-the-Webkit-engine.html
看看这个有没帮助

你下载的 dompdf 本身应该是没有问题的(这一点你可以通过生成 pdf 加以验证)
由于 dompdf 提供了生成图片的功能,所以也只是在正确生成 pdf 的基础上,通过定义 DOMPDF_PDF_BACKEND 常量将其图片生成的功能调出来而已
至于在测试时修改它的部分代码,这也是出于测试、分析的需要。也当然是自己对修改产生的后果负责


我把xml改成public 里 现在提示错误

DOMDocument Object ( )
Warning: Cannot modify header information - headers already sent by (output started at G:\AppServ\www\6\1.php:16) in G:\AppServ\www\6\include\gd_adapter.cls.php on line 736

Warning: Cannot modify header information - headers already sent by (output started at G:\AppServ\www\6\1.php:16) in G:\AppServ\www\6\include\gd_adapter.cls.php on line 751

谢谢版主的热心回复

不同版本的 dompdf 会有不同的表现(我这是 dompdf.php,v 1.24 2009-04-29 的)
它使用 DOMDocument 解析 html
print_r($dompdf->_xml);
可以看到解析是否正常


可否把你的版本发出来测试一下,用的0.5.2这个版本的测试了,没效果,图片没显示,也没发现有xml支持的

不报错似乎不应该
gd写文字总是需要字体文件的
dompdf的默认字体是 Times-Roman
为此作为测试,你可以将任意一款ttf中文字体复制到 lib/fonts 目录中,并更名为 Times-Roman.ttf

版本声明

<?php/** * DOMPDF - PHP5 HTML to PDF renderer * * File: $RCSfile: dompdf.php,v $ * Created on: 2004-06-22 * * Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library in the file LICENSE.LGPL; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * Alternatively, you may distribute this software under the terms of the * PHP License, version 3.0 or later.  A copy of this license should have * been distributed with this file in the file LICENSE.PHP .  If this is not * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. * * The latest version of DOMPDF might be available at: * http://www.digitaljunkies.ca/dompdf * * dompdf.php is a simple script to drive DOMPDF.  It can be executed from * a browser or from the command line. * * @link http://www.digitaljunkies.ca/dompdf * @copyright 2004 Benj Carson * @author Benj Carson <benjcarson@digitaljunkies.ca> * @package dompdf * @version 0.5.1 *//* $Id: dompdf.php,v 1.24 2009-04-29 04:11:35 benjcarson Exp $ */
ログイン後にコピー
ログイン後にコピー

不报错似乎不应该
gd写文字总是需要字体文件的
dompdf的默认字体是 Times-Roman
为此作为测试,你可以将任意一款ttf中文字体复制到 lib/fonts 目录中,并更名为 Times-Roman.ttf

版本声明

<?php/** * DOMPDF - PHP5 HTML to PDF renderer * * File: $RCSfile: dompdf.php,v $ * Created on: 2004-06-22 * * Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library in the file LICENSE.LGPL; if not, write to the * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * Alternatively, you may distribute this software under the terms of the * PHP License, version 3.0 or later.  A copy of this license should have * been distributed with this file in the file LICENSE.PHP .  If this is not * the case, you can obtain a copy at http://www.php.net/license/3_0.txt. * * The latest version of DOMPDF might be available at: * http://www.digitaljunkies.ca/dompdf * * dompdf.php is a simple script to drive DOMPDF.  It can be executed from * a browser or from the command line. * * @link http://www.digitaljunkies.ca/dompdf * @copyright 2004 Benj Carson * @author Benj Carson <benjcarson@digitaljunkies.ca> * @package dompdf * @version 0.5.1 *//* $Id: dompdf.php,v 1.24 2009-04-29 04:11:35 benjcarson Exp $ */
ログイン後にコピー
ログイン後にコピー


php版本我更改为php5.4.18了,xml可以正常了
可还是无法显示图片,还是打叉的,我也下的是你上面这个版本* @version 0.5.1了

不过时间是有点区别

* @version 0.5.1
*/

/* $Id: dompdf.php,v 1.17 2006/07/07 21:31:02 benjcarson Exp $ */

是1.17的,不是1.24的,你能把你这个1.24的打包发出来测试下不?

已上传 http://download.csdn.net/detail/xuzuning/5958493

已上传 http://download.csdn.net/detail/xuzuning/5958493


我用了0.6那个版本+php5.2.0可以显示图片了,不过没有显示全部,中文部分没显示定义的数字也没显示

由于 dompdf 使用 DOMDocument 解析 HTML
所以被解析的 HTML 文档中一定要有语言声明

否则将按欧洲语言解析,汉字就不能显示了

使用 php 的截屏函数 imagegrabscreen、imagegrabwindow

这2个函数有谁使用过的没?

由于 dompdf 使用 DOMDocument 解析 HTML
所以被解析的 HTML 文档中一定要有语言声明

否则将按欧洲语言解析,汉字就不能显示了


好像不能随便换字体,你这个貌似跟直接在google下载的有点不一样,要改字体,好像还得改程序

你用我给你的试试

截屏函数只用于 window 系统

刚才下了最新的 0.6
@version $Id: dompdf.php 448 2011-11-13 13:00:03Z fabien.menager $

补上字体文件 Times-Roman.ttf
#6 的代码即可正常运行

刚才下了最新的 0.6
@version $Id: dompdf.php 448 2011-11-13 13:00:03Z fabien.menager $

补上字体文件 Times-Roman.ttf
#6 的代码即可正常运行


是的,用0.6的,不用补字体也正常

不管哪个导出的图片会却像素色

是的,dompdf 的渲染效果很差不过0.6也改进了不少
但比起 tcpdf 来就差的太远了,只是 tcpdf 尚不支持输出图片。改起来也太费劲了

是的,dompdf 的渲染效果很差不过0.6也改进了不少
但比起 tcpdf 来就差的太远了,只是 tcpdf 尚不支持输出图片。改起来也太费劲了


使用过截屏的方法么?

截屏

$im = imagegrabscreen();imagepng($im, "myscreenshot.png");imagedestroy($im);
ログイン後にコピー

不过很慢,1440 x 900 大约 十七八秒

由于 php5.4 不再支持 com 了,imagegrabwindow 未作测试

真不如 [Prtsc Sys Rq] 和 [Alt]+[Prtsc Sys Rq] 在粘贴到“画图”中来的快

看了不少资料,感觉php做这个目前确实很薄弱

如果你是在 linux 下,那么你应该可以找到借助浏览器内核做分析的 php 项目

啥意思?html2img?我用c#做过 就是访问一个网址 生成图片

这和验证码生成不是一个原理?

这和验证码生成不是一个原理?


不是

那就可以用webscreencapture.exe之类的PHP截屏软件。


不同版本的 dompdf 会有不同的表现(我这是 dompdf.php,v 1.24 2009-04-29 的)
它使用 DOMDocument 解析 html
print_r($dompdf->_xml);
可以看到解析是否正常


可否把你的版本发出来测试一下,用的0.5.2这个版本的测试了,没效果,图片没显示,也没发现有xml支持的

gd_adapter.cls.php 的751行屏蔽header("Content-type: image/png");這句就報錯了

我測試了一下0.6版,就算排除了所有的錯誤之後對於html的解析還是非常不理想

我測試了一下0.6版,就算排除了所有的錯誤之後對於html的解析還是非常不理想


是的,是很不理想,php这个是个软肋啊

不满意可以改,不想改就自己写
只要对 css 很熟悉的话,做起来并不复杂
用 DOMDocument::loadHTML 载入 html
析出各个元素的属性
计算每个盒子的尺寸和位置 这个比较复杂,需对 css 很熟悉
逐一绘制

不满意可以改,不想改就自己写
只要对 css 很熟悉的话,做起来并不复杂
用 DOMDocument::loadHTML 载入 html
析出各个元素的属性
计算每个盒子的尺寸和位置 这个比较复杂,需对 css 很熟悉
逐一绘制


这个是什么意思?

CSS,我自认还行,你说的用那个可以做到?还是什么?
反正那个我测试了不行

不满意可以改,不想改就自己写
只要对 css 很熟悉的话,做起来并不复杂
用 DOMDocument::loadHTML 载入 html
析出各个元素的属性
计算每个盒子的尺寸和位置 这个比较复杂,需对 css 很熟悉
逐一绘制


主要是生成图片以后就没有了那么多样式了

自己繪製只能繪製一個大概而已,並不能做到完美,看來只能另闢蹊徑藉助瀏覽器的內核了.

不满意可以改,不想改就自己写
只要对 css 很熟悉的话,做起来并不复杂
用 DOMDocument::loadHTML 载入 html
析出各个元素的属性
计算每个盒子的尺寸和位置 这个比较复杂,需对 css 很熟悉
逐一绘制



http://www.tqcp.net/kong_bct.php
你看他这个是如何做到的,他这个就是动态生成图片的哦,格式还很漂亮,究竟PHP怎么做到的?

那是固定格式,用gd很容易做到

那是固定格式,用gd很容易做到



这个怎么实现呢?
我测试过多次都不行的,都是有瑕疵的

给你个示例代码

<?php$im = imagecreatefromstring(get());$ind = vertical($im);//取得垂直分布,用人工分析比较简单$w = imagesx($im);//抽取头部$top_h = 59;$top = imagecreate($w, $top_h);imagecopy($top, $im, 0, 0, 0, 0, $w, $top_h); for($y=6; $y<29; $y++) imagecopy($top, $top, 0, $y, 0, 5, $w, 1);//imagegif($top); exit; //抽取中段(空白的)$middle_h = 29;$middle = imagecreate($w, $middle_h);imagecopy($middle, $im, 0, 0, 0, 59, $w, $middle_h);for($y=2; $y<$middle_h-1; $y++) imagecopy($middle, $middle, 0, $y, 0, 1, $w, 1);//imagegif($middle); exit;//抽取中段(红色分隔线空白的)$middlered_h = 29;$middlered = imagecreate($w, $middlered_h);imagecopy($middlered, $im, 0, 0, 0, 175, $w, $middle_h);for($y=2; $y<$middle_h-1; $y++) imagecopy($middlered, $middlered, 0, $y, 0, 1, $w, 1);//imagegif($middlered); exit;//抽取底部$bottom_h = 41;$bottom = imagecreate($w, $bottom_h);imagecopy($bottom, $im, 0, 0, 0, 318, $w, $bottom_h); //imagegif($bottom); /*至此,我们已经准备好了组装空白彩票的部件。对于你自己的图片,当然是要自己动手画一些了他的组装规则是: 头部 + ((行数 - 1) % 4) * 中段 + ceil((行数 - 1) / 4) * (红线中段 + 3 * 中段)+ 中段 + 底部(底部上压一线)现在就按次规则组装*/$row = 11;$h = $top_h + (($row - 1) % 4) * $middle_h + ceil($row / 4) * 4 * $middle_h + $middle_h - 1 + $bottom_h;$new = imagecreate($w, $h);$y = 0;$k = 0;imagecopy($new, $top, 0, $y, 0, 0, $w, $top_h);$y += $top_h;for($i=0; $i<($row - 1) % 4; $i++, $y+=$middle_h) {  imagecopy($new, $middle, 0, $y, 0, 0, $w, $middle_h);  $k++;}for($i=0; $i<ceil($row / 4) * 4; $i++, $y+=$middle_h) {  if($k++ && $i % 4 == 0) imagecopy($new, $middlered, 0, $y, 0, 0, $w, $middle_h);  else imagecopy($new, $middle, 0, $y, 0, 0, $w, $middle_h);}imagecopy($new, $middle, 0, $y, 0, 0, $w, $middle_h);$y += $middle_h;imagecopy($new, $bottom, 0, $y-1, 0, 0, $w, $bottom_h);imagegif($new);function vertical($im) {  $num = 0;  for($y=0; $y<imagesy($im); $y++) {    $p = imagecolorat($im, 6, $y);    if($y == 0) $last = $p;    if($p != $last && $num) {      $res[$y-$num] = array($last, $num);      $last = $p;      $num = 0;    }    $num++;  }  $res[$y-$num] = array($last, $num);  //print_r($res);//$ind 保存了像素的垂直分布  return $res;}function get($n=5) {  $url = 'http://www.tqcp.net/ct_end.php';  $param = array('nqis' => $n, 'cmdOk' => '确定');  $ch = curl_init();  curl_setopt($ch, CURLOPT_URL,$url);  curl_setopt($ch, CURLOPT_POST, 1);  curl_setopt($ch, CURLOPT_POSTFIELDS, $param);  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  $r = curl_exec($ch);  curl_close($ch);  return $r;}
ログイン後にコピー

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート