一,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 Fileswkhtmltopdfinclude
库目录为:(为wkhtmltopdf的安装目录下的lib)
D:Program Fileswkhtmltopdflib
在使用的项目中添加头文件以及库文件:
#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(" "); 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 + " "); // m_editPipe是edit控件关联的变量 strData.erase(0, index+1); } } while (std::string::npos != index); CloseHandle(hReadPipe); strContent.ReleaseBuffer();
当然,这样使用也有不便之处:就是在生成的pdf文件中名称中不能有空格否则无法转换