PhantomJS 篇

标签: #Share

PhantomJS 组件常用在爬虫领域,但是它也有其非常灵活的一面,即用作截取网页长图,或者将网页内容存储为PDF

PhantomJS 下载

地址

API文档库

Windows使用

下载完成后,直接解压即可直接进行使用,同时调用PhantomJS.exe时需要配合JS一同使用,以转出PNG图片或者PDF为例

JS文件

// JS -> 可直接运行生成PDF或者PNG   HTML转PDF需求解决方案:HTML -> PNG -> PDF或者HTML -> PDF
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');
    phantom.exit(1);
} else {
	// 目标地址
    address = system.args[1];
	
	// 输出地址
    output  = system.args[2];
	
	// 尺寸 1200*7000
	size    = system.args[3].split('*');
    console.log(page.settings.userAgent );
	page.settings.loadImages = true;
    page.paperSize = {width: size[0], height: size[1], orientation: 'portrait', border: '0.5cm' };
    console.log("open page now");
    page.open(address, function (status) {
        console.log(status);
        // 预留一定的渲染时间
        window.setTimeout(function () {
            page.render(output);
            page.close();
            console.log('Render ok');
            phantom.exit();
        }, 3000);
    });
};

命令如下

F:\browsers\phantomjs-2.1.1-windows\bin>
phantomjs.exe html2pdf.js "参数一:URL" "参数二:输出文件地址可以为xxx.png或者xxx.pdf" "尺寸如:1200*6500"

命令参数根据JS文件调整即可 输出文件为 .pdf 即输出PDF文件,为.png即输出截图图片

与此同时JS文件中的尺寸大小可以直接调整为如A4纸等等

JS文件Tips

// 如果想要强行对PDF内容进行分页,对需要分页的内容增加以下样式即可
.pdf-page {
	page-break-before: always;
	page-break-after: always;
	page-break-inside: avoid;
}

Linux环境使用

PhantomJS 安装步骤:

  • 下载安装包并解压
  • 安装依赖软件: yum -y install wget fontconfig
  • 设置环境变量:ln -s /目标地址/bin /usr/bin/
  • phantomjs -v 检测是否安装成功
  • 安装中文字体:
    centos中执行 :yum install bitmap-fonts bitmap-fonts-cjk
    ubuntu中执行:sudo apt-get install ttf-wqy-zenhei #文泉驿-正黑 (全平台兼容字体)

其余使用方式同windows一致,通过 phantomjs xxx.js 参数一 参数二….

值得注意的是:Linux的PDF渲染效果不如Windows,Mac好

PNG图片转PDF代码技巧

可以直接将PNG图片完美塞入到PDF中,缺点即不可直接复制文字

<!-- 生成PDF -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.11</version>
</dependency>
public class PDFUtils {
    public static void imgToPdf (String imgUrl, String pdfUrl) throws IOException, DocumentException {
        Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
        PdfWriter.getInstance(doc, new FileOutputStream(pdfUrl));
        doc.open();

        // Img
        Image png = Image.getInstance(imgUrl);
        png.setAlignment(Image.MIDDLE);
        doc.setPageSize(new Rectangle(png.getPlainWidth(), png.getPlainHeight() + 300F));
        doc.newPage();
        doc.add(png);
        doc.close();
    }
}

中文乱码问题

在使用Ubuntu服务器作为截图以及渲染PDF介质时,会遇到很坑的中文乱码问题,一般解决办法是下载安装文泉驿宋体,但是经过

测试,在苹果手机,电脑等依然会是乱码,因此针对ubuntu服务器,可以使用文泉驿正黑字体解决乱码问题:

sudo apt-get install ttf-wqy-zenhei      #文泉驿-正黑 (全平台兼容字体)

Ubuntu如果需要安装其他字体,参考步骤:

# 安装字体管理工具
sudo apt-get install font-manager

# 查看现有字体(可查看到字体安装位置)
fc-list

安装字体:

# 安装字体

# 方式一:
# 在/usr/share/fonts目录下,新建如 chinese文件夹,将需要的tff文件复制进文件夹,如微软雅黑等
# 然后执行如下命令:
mkfontscale
mkfontdir
fc-cache -fv (刷新字体缓存)

# 方式二,通过软件安装:
sudo apt-get install ttf-wqy-microhei   #文泉驿-微米黑
sudo apt-get install ttf-wqy-zenhei     #文泉驿-正黑 (全平台兼容字体)
sudo apt-get install xfonts-wqy         #文泉驿-点阵宋体

# 注意通过软件安装的方式,其实也是在/usr/share/fonts目录下新建了文件夹并移入了tff字体,因此卸载逻辑和下面一致

卸载字体:

# 卸载字体的方式非常简单,例如我们新建了chinese目录,只需要 rm -rf ....chinese(包含字体的目录)
# 再刷新字体缓存即可
rm -rf /usr/share/fonts/demo
fc-cache -fv

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

Mysql技巧及面试篇 上一篇
Nginx篇 下一篇