开源wkhtmltopdf使用心得 (二)

一,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文件中名称中不能有空格否则无法转换

原文地址:https://www.cnblogs.com/zxqdlenovo/p/5775634.html