一,wkhtmltopdf使用
a、
下载wkhtmltopdf安装包:(本人仅在win7 32位上使用)
http://download.gna.org/wkhtmltopdf/0.12/ 根据系统选择相应安装包
下载安装完成,在命令行中执行转换命令
wkhtmltopdf www.myhomepage.com myhomepage.pdf
能正确转换网页为PDF或者是图片,并且支持中文路径和中文文件名
b、
在自己项目中添加该项目实现转换功能有2种方法
(1)
第一种、在vs项目中添加包含目录和库目录
包含目录:(为wkhtmltopdf的安装目录下的include)
D:\Program Files\wkhtmltopdf\include
库目录为:(为wkhtmltopdf的安装目录下的lib)
D:\Program Files\wkhtmltopdf\lib
在使用的项目中添加头文件以及库文件:
#include <wkhtmltox/pdf.h>
#include <wkhtmltox/image.h>
#pragma comment(lib, "wkhtmltox.lib")
将wkhtmltopdf.exe与wkhtmltox.dll复制到当前项目生成的exe目录下并在项目中使用该exe
char command[1024] = " www.baidu.com 1231.pdf"; //长达1K的命令行,够用了吧
ShellExecute(this->m_hWnd, "open", "D:\\htmltopdf\\wkhtmltopdf.exe", sWebAddress, NULL, SW_HIDE);
注意:如果想要获得该后台程序的返回结果应该使用匿名管道来接收
CString sWebAddress;
sWebAddress = "D:\\htmltopdf\\wkhtmltopdf";
sWebAddress += " www.baidu.com"; // 注意前面的空格一定不能省略
sWebAddress += " D:\\my资料库\\是PDF.pdf";// 注意前面的空格一定不能省略
// 创建管道
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES sa; //安全属性结构
sa.nLength = sizeof(SECURITY_ATTRIBUTES); //结构体大小
sa.lpSecurityDescriptor = NULL;// file://使用系统默认的安全描述符
sa.bInheritHandle = TRUE;// file://一定要为TRUE,不然句柄不能被继承。
if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, NULL)) {
MessageBox("Error On CreatePipe()");
return;
}
//创建进程
STARTUPINFO si; //进程信息
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO); //结构体大小
GetStartupInfo(&si); //获取当前进程的信息
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
si.wShowWindow = SW_HIDE; // SW_HIDE隐藏新建的DOS进程
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcess(NULL, sWebAddress.GetBuffer(0)
,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL, &si, &pi)) {
DWORD error = GetLastError();
MessageBox("Error on CreateProcess()");
CloseHandle(hWritePipe);
CloseHandle(hReadPipe);
return;
}
CloseHandle(hWritePipe);
WaitForSingleObject(pi.hProcess,INFINITE);
CString strContent;
//获取管道信息
char buffer[1024] = {0};
DWORD bytesRead;
while(PeekNamedPipe(hReadPipe, buffer, 1023, &bytesRead, NULL, NULL))
{
if(bytesRead <= 0)
break;
RtlZeroMemory( buffer, 1024);
if (ReadFile(hReadPipe,buffer,1023,&bytesRead,NULL) == NULL)
{
break;
}
strContent += buffer;
}
// 以下过程是为了解析返回的结果用来显示
std::string strData = strContent;
std::vector<std::string> vecData;
std::string tmpData;
std::string::size_type index = 0;
do
{
index = strData.find("\r");
if (index != std::string::npos)
{
tmpData = strData.substr(0, index);
vecData.push_back(tmpData);
CString string;
string.Format("%s",CA2W(tmpData.c_str()));
m_editPipe.ReplaceSel(string + "\r\n"); // m_editPipe是edit控件关联的变量
strData.erase(0, index+1);
}
} while (std::string::npos != index);
CloseHandle(hReadPipe);
strContent.ReleaseBuffer();
当然,这样使用也有不便之处:就是在生成的pdf文件中名称中不能有空格否则无法转换