是否可以捕获或打印html画布中显示的图像或pdf?
我想通过画布生成一个图像,并能够从该图像生成一个png.
哎呀.原始答案是针对类似问题的.这已被修改:
var canvas = document.getElementById("mycanvas"); var img = canvas.toDataURL("image/png");
使用IMG中的值,您可以将其写为新图像,如下所示:
document.write('');
HTML5提供了Canvas.toDataURL(mimetype),它在Opera,Firefox和Safari 4 beta中实现.但是,有许多安全限制(主要与将另一个来源的内容绘制到画布上有关).
所以你不需要额外的库.
例如
从理论上讲,这应该创建然后导航到中间有绿色方块的图像,但我还没有测试过.
我想我会扩展这个问题的范围,在这个问题上有一些有用的花絮.
要将画布作为图像,您应该执行以下操作:
var canvas = document.getElementById("mycanvas"); var image = canvas.toDataURL("image/png");
您可以使用它将图像写入页面:
document.write('');
其中"image/png"是mime类型(png是唯一必须支持的类型).如果您想要一组受支持的类型,您可以按照以下方式执行某些操作:
var imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/tiff']; //Extend as necessary var acceptedMimes = new Array(); for(i = 0; i < imageMimes.length; i++) { if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0) { acceptedMimes[acceptedMimes.length] = imageMimes[i]; } }
您只需要每页运行一次 - 它永远不会在页面的生命周期中发生变化.
如果您希望让用户在保存文件时下载该文件,您可以执行以下操作:
var canvas = document.getElementById("mycanvas"); var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); //Convert image to 'octet-stream' (Just a download, really) window.location.href = image;
如果您使用不同的mime类型,请务必更改image/png的两个实例,而不是image/octet-stream.还值得一提的是,如果在渲染画布时使用任何跨域资源,则在尝试使用toDataUrl方法时将遇到安全性错误.
function exportCanvasAsPNG(id, fileName) { var canvasElement = document.getElementById(id); var MIME_TYPE = "image/png"; var imgURL = canvasElement.toDataURL(MIME_TYPE); var dlLink = document.createElement('a'); dlLink.download = fileName; dlLink.href = imgURL; dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':'); document.body.appendChild(dlLink); dlLink.click(); document.body.removeChild(dlLink); }
我会用" wkhtmltopdf ".它工作得很好.它使用webkit引擎(用于Chrome,Safari等),它非常易于使用:
wkhtmltopdf stackoverflow.com/questions/923885/ this_question.pdf
而已!
试试吧
如果您通过服务器进行下载,这里有一些帮助(这样您可以命名/转换/后处理/等文件):
- 使用的数据 toDataURL
- 设置标题
$filename = "test.jpg"; //or png header('Content-Description: File Transfer'); if($msie = !strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) header("Content-type: application/force-download");else header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"$filename\""); header("Content-Transfer-Encoding: binary"); header("Expires: 0"); header("Cache-Control: must-revalidate"); header("Pragma: public");
- 创建图像
$data = $_POST['data']; $img = imagecreatefromstring(base64_decode(substr($data,strpos($data,',')+1)));
- 出口图像为JPEG
$width = imagesx($img); $height = imagesy($img); $output = imagecreatetruecolor($width, $height); $white = imagecolorallocate($output, 255, 255, 255); imagefilledrectangle($output, 0, 0, $width, $height, $white); imagecopy($output, $img, 0, 0, 0, 0, $width, $height); imagejpeg($output); exit();
- 或透明的PNG
imagesavealpha($img, true); imagepng($img); die($img);
另一个有趣的解决方案是PhantomJS.这是一个使用JavaScript或CoffeeScript的无头WebKit脚本.
其中一个用例是屏幕截图:您可以通过编程方式捕获Web内容,包括SVG和Canvas和/或使用缩略图预览创建网站屏幕截图.
最佳入口点是屏幕截图维基页面.
这是极地时钟的一个很好的例子(来自RaphaelJS):
>phantomjs rasterize.js http://raphaeljs.com/polar-clock.html clock.png
您要将页面呈现为PDF吗?
> phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf