zoukankan      html  css  js  c++  java
  • 开源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文件中名称中不能有空格否则无法转换

  • 相关阅读:
    Codeforces 963E Alternating Sum 等比数列+逆元
    poj 3255 次短路
    hdu 3183 rmq+鸽巢原理
    poj 2505 乘法博弈论
    欧拉函数模板
    java中的进制转换以及字符串类和数值类的相互转化
    java 大数运算,高精度模板
    线段树模板
    [OI笔记]每周刷题记录
    HDU4388-Stone Game II-Nim变形
  • 原文地址:https://www.cnblogs.com/zxqdlenovo/p/5775634.html
Copyright © 2011-2022 走看看