phantomjs html to PDF

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.IO;

/// <summary>
///PDFCommon 的摘要说明
/// </summary>
public class PDFCommon
{
	public PDFCommon()
	{

	}
    public static string CreatePDF(string url)
    {
        string fileNameWithOutExtention = Guid.NewGuid().ToString();
        string path = System.Web.HttpContext.Current.Server.MapPath(@"~\bin\phantomjs\");
        //string paths = System.Web.HttpContext.Current.Server.MapPath(@"~\chartPdfFile");
        string savePath = Path.Combine(@"D:/", string.Format("{0}.pdf", Guid.NewGuid()));
        string filePath = Path.Combine(path, "phantomjs.exe");
        string jsPath = Path.Combine(path, "generate_pdf.js");
        string argument = string.Format(" --ignore-ssl-errors=yes  {0} \"{1}\" {2}", jsPath, url, savePath);
        using (System.Diagnostics.Process exep = new System.Diagnostics.Process())
        {
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.FileName = filePath;
            startInfo.Arguments = argument;
            startInfo.CreateNoWindow = true;
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            exep.StartInfo = startInfo;
            exep.Start();
            exep.WaitForExit();
        }
        return savePath;
    }
}

  

// This file is NOT a browser-run javascript but PhantonJS script
var system = require(‘system‘);
var address = system.args[1];
var output = system.args[2];
var page = require(‘webpage‘).create();
page.paperSize = {
  format: ‘A4‘,
  orientation: ‘landscape‘,
  border: ‘1cm‘
};
page.open(address, function (status) {
    if (status !== ‘success‘) {
        console.log(‘Unable to load the address!‘);
        phantom.exit();
    } else {
        window.setTimeout(function () {
            // Remove all low-opacity paths. see PhantomJS  issue #364
            page.evaluate(function () {
                var paths = document.getElementsByTagName("path");
                for (var i = paths.length - 1; i >= 0; i--) {
                    var path = paths[i];
                    var strokeOpacity = path.getAttribute(‘stroke-opacity‘);
                    if (strokeOpacity != null && strokeOpacity < 0.2)
                        path.parentNode.removeChild(path);
                }
            });
            page.render(output);
            phantom.exit();
        }, 5000);
    }
});

  

开篇

最近使用 Phantomjs 生成PDF,其中遇到一些问题,导致PDF生成失败,如出现空白文件或一页数据量太大,都是由于没有设置好格式导致。特别是分页问题,感觉资料很少,除了在 StackOverflow 上看到些许资料外,中文社区基本看不到,附上修改后的 rasterize.js 来做讲解:

var page = require(‘webpage‘).create(),
system = require(‘system‘),
address, output, size;

if (system.args.length < 3 || system.args.length > 5) {
console.log(‘Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]‘);
console.log(‘ paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"‘);
phantom.exit(1);
} else {
address = system.args[1];
output = system.args[2];
/*size of browser*/
page.viewportSize = { width: 600, height: 600 };
/*
if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
size = system.args[3].split(‘*‘);
page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: ‘0px‘ }
: { format: ‘A4‘, orientation: ‘portrait‘, margin: ‘1cm‘ };
}
*/
/* ie and chrome view diffrent format of pdf */
page.settings.userAgent = ‘Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36‘;
page.paperSize = { format: ‘A4‘, orientation: ‘portrait‘, margin: ‘0.8cm‘ };
page.zoomFactor = 1;
page.settings.loadImages = true;
//some question about the page language
page.open(address, function (status) {
if (status !== ‘success‘) {
console.log(‘Unable to load the address!‘);
} else {
//page.render(output);
//phantom.exit();

window.setTimeout(function () {
page.render(output);
phantom.exit();
}, 200); //setting the time is enough to loading the page. document.ready

}
});
}

 1 var page = require(‘webpage‘).create(),
 2     system = require(‘system‘),
 3     address, output, size;
 4
 5 if (system.args.length < 3 || system.args.length > 5) {
 6     console.log(‘Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]‘);
 7     console.log(‘  paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"‘);
 8     phantom.exit(1);
 9 } else {
10     address = system.args[1];
11     output = system.args[2];
12     /*size of browser*/
13     page.viewportSize = { width: 600, height: 600 };
14     /*
15     if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
16         size = system.args[3].split(‘*‘);
17         page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: ‘0px‘ }
18                                            : { format: ‘A4‘, orientation: ‘portrait‘, margin: ‘1cm‘ };
19     }
20     */
21     /* ie and chrome view diffrent format of pdf */
22     page.settings.userAgent = ‘Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36‘;
23     page.paperSize = { format: ‘A4‘, orientation: ‘portrait‘, margin: ‘0.8cm‘ };
24     page.zoomFactor = 1;
25     page.settings.loadImages = true;
26     //some question about the page language
27     page.open(address, function (status) {
28         if (status !== ‘success‘) {
29             console.log(‘Unable to load the address!‘);
30         } else {
31             //page.render(output);
32             //phantom.exit();
33
34             window.setTimeout(function () {
35                 page.render(output);
36                 phantom.exit();
37             }, 200); //setting the time is enough to loading the page. document.ready
38
39         }
40     });
41 }

PDF 格式设置

关于其中 page 的设置属性,这里可以了解,更深入可以了解 WebPage Module

我们需要的设置,基本上就是页面格式、缩放、加载图片等,但有些例外,下面一一讲解。

1 page.paperSize = { format: ‘A4‘, orientation: ‘portrait‘, margin: ‘0.8cm‘ };

注释掉了官方例子的设置代码,因为传入的参数只有3个,到 .pdf 为止,如果写成通用模式,当然可以作为外部参数传入。

format :A4 纸,可以设置 "5in*7.5in", "10cm*20cm",  "Letter" 等

orientation :纸方向是竖着的,或者 landscape

margin :与纸四边间距,可自定义,也可详细设置 margin : { left: ‘0.8cm‘,  top : ‘0.8cm‘,  right : ‘0.8cm‘,  bottom : ‘0.8cm‘ }

1 page.zoomFactor = 1;
2 page.settings.loadImages = true;

zoomFactor :页面缩放比例

loadImages :页面加载图片

1 page.settings.userAgent = ‘Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36‘;

这个设置比较不常见,一般的示例中都没有提及,因为发现用 chrome 和 IE 打开生成的 pdf 时格式有点不一样(表现在分页方面),由于偏向 Chrome 浏览格式,故设置此值,解决这个不一致问题。

page.open 里面的 setTimeout 方法作用:等待页面执行完 js ,再生成 pdf。当然对于 js 要执行多久(要等多久),这个就不知道怎么预算了。其实我有试过 ajax 方式加载内容,但因此问题而作罢了。

更多的信息,关于页眉和页脚及页码标注问题,可以参考这里

PDF 分页

分页来说,更好控制,不需要代码(js)设置,页面使用样式即可:


1

style = “page-break-afteralways;”

控制每页内容的大小,使用 <div style="page-break-after: always;">content</div> 就行。

更多选择 style=“page-break-before: always;” , style="page-break-inside: avoid;" 这个可以避免内容散到两页中

时间: 2024-10-13 05:13:01

phantomjs html to PDF的相关文章

使用webdriver + phantomjs + pdfkit 生成PDF文件

实例 #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on Dec 6, 2013 @author: Jay <[email protected]> @description: use PhantomJS to parse a web page to get the geo info of an IP ''' import datetime import urllib # from pyquery import PyQuery as

总会有一个是你需要的

http://www.shouce.ren/post/d/id/112300 黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299 黑客入门新手特训.pdfhttp://www.shouce.ren/post/d/id/112298 黑客与设计-剖析设计之美的秘密(彩印).pdfhttp://www.shouce.ren/post/d/id/112297 鸟哥的LINUX私房菜:服务器架设篇 (第二版).pdfhttp://www.shouc

Phantomjs 生成多页PDF

开篇 最近使用 Phantomjs 生成PDF,其中遇到一些问题,导致PDF生成失败,如出现空白文件或一页数据量太大,都是由于没有设置好格式导致.特别是分页问题,感觉资料很少,除了在 StackOverflow 上看到些许资料外,中文社区基本看不到,附上修改后的 rasterize.js 来做讲解: 1 var page = require('webpage').create(), 2 system = require('system'), 3 address, output, size; 4

ruby on rails 中使用phantomjs 生成pdf

一.新建项目 rails new app --skip-bundle 完成后修改Gemfile文件:vim Gemfile 把source 修改成taobao或者ruby-china的源. 在这个文件里加入:gem 'phantomjs' 然后运行:bundle install 这样项目就新建完成了. 二.生成pdf 创建一个controller在头部加上require 'phantomjs',在里面加入一个获取pdf的get方法:get_pdf 在这个方法里加入如下代码: Phantomjs.

Python爬虫利器四之PhantomJS的用法

前言 大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的html代码,如果页面是JS渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索JS渲染的到的一些结果,那简直没天理了.所以,我们需要有一些好用的工具来帮助我们像浏览器一样渲染JS处理的页面. 其中有一个比较常用的工具,那就是 PhantomJS Full web stack No browser required PhantomJS is a headless WebKit scriptable with a Ja

windows下gitbook与开源中国码云关联,以及如何gitbook转pdf

gitbook能够很方便的和github关联,实现团队协作的效果.可是github私有库需要付费.但是开源中国码云能够建私有库,于是考虑将gitbook关联码云,折腾了一番后,能够可视化的关联,后面就没有继续的深入了,毕竟预期的目的基本达到了.以下内容均为实践所得,仅供大家参考! windows下搭建gitbook平台 参考:gitbook安装与使用之windows下搭建gitbook平台,非常详细 与码云关联 需要用到的工具:gitbookEditor,git版本控制器 1.首先在码云中新建一

PhantomJS

PhantomJS 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 概述 REPL环境 webpage模块 open() evaluate() includeJs() render() viewportSize,zoomFactor onResourceRequested onResourceReceived system模块 应用 过滤资源 截图 抓取图片 生成网页 参考链接 概述 有时,我们需要浏览器处理网页,但并不需要浏览,比如生成网页的截图.抓取网页数据等

ruby on rails 中使用phantomjs,并使用cookie

一.新建项目 rails new app --skip-bundle 完成后修改Gemfile文件:vim Gemfile 把source 修改成taobao或者ruby-china的源. 在这个文件里加入:gem 'phantomjs' 然后运行:bundle install 这样项目就新建完成了. phantomjs需要单独下载,如果不下载,这个gem运行的时候会自动下载,可能会比较慢. 二.生成pdf 创建一个controller在头部加上require 'phantomjs' 在form

phantomjs使用说明

phantomjs使用说明 12条评论 phantomjs实现了一个无界面的webkit浏览器.虽然没有界面,但dom渲染.js运行.网络访问.canvas/svg绘制等功能都很完备,在页面抓取.页面输出.自动化测试等方面有广泛的应用. 安装 下载phantomjs(官方下载,下载失败请访问另一个下载点).解压到任意目录,并将包含phantomjs.exe的目录添加到系统路径. 如果要借助phantomjs进行无头测试,请参考各个测试框架的说明,或者参考phantomjs的官方文档:http:/