各种PDF转换问题(一).在C++中借助Acrobat将PDF转为TIFF

总是碰到各种PDF相关的转换问题。故记录一二,以作总结。


此处是借助Acrobat来进行转换,首先要安装Acrobat,装完后,系统中会有Acrobat 的COM库,同时,安装目录下有一个Acrobat.tlb和Acrobat.dll文件,这都是我们所需要的。


1.建立C++工程,将tlb添加到工程中(为了方便使用,其实不添加也可以)。在代码中#import "Acrobat.tlb"。


2.定义两个类成员变量:

	Acrobat::CAcroAppPtr	acrapp;
	Acrobat::CAcroPDDocPtr  acrdoc;

3.在类构造函数中,对COM进行初始化,同时初始化以上两个变量,析构函数反之(这里COM初始化和卸载因实际需要而谨慎处理):

	CSigner() 
		: strError(L"")
		, acrapp(NULL)
		, acrdoc(NULL)
	{
		::CoInitialize(NULL);
	}
	~CSigner()
	{
		::CoUninitialize();
	}

4.在类的初始化函数中,创建COM实例:

	if(NULL == acrapp)
	{
		acrapp.CreateInstance(Acrobat::CLSID_AcroApp);
		acrapp->Hide(&ret);
	}
	if(NULL == acrdoc)
	{
		acrdoc.CreateInstance(Acrobat::CLSID_AcroPDDoc);
	}

5.关键部分来了。调用Acrobat COM组件的SaveAs方法,做“另存为”操作,即可将PDF转为其它格式(具体格式字符串网上可查):

	// TODO: 在此添加实现代码
	HRESULT hr = S_OK;
	try
	{
		VARIANT_BOOL ret = VARIANT_TRUE;
		hr = acrdoc->Open(strPdfPath, &ret);
		if(FAILED(hr))throw (hr);
		IDispatch FAR* jso = NULL;
		hr = acrdoc->GetJSObject(&jso);
		if(FAILED(hr))throw (hr);

		DISPID dispId;
		OLECHAR FAR* szMember = L"SaveAs";
		hr = jso->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispId);
		if(FAILED(hr))throw (hr);
		DISPPARAMS dispParams;
		memset(&dispParams, 0, sizeof(dispParams));
		dispParams.cArgs = 2;
		CComVariant* pVars = new CComVariant[2];
		pVars[1] = strTifPath;
		pVars[0] = L"com.adobe.acrobat.tiff";
		pVars[1].ChangeType(VT_BSTR);
		pVars[0].ChangeType(VT_BSTR);
		dispParams.rgvarg = pVars;
		dispParams.cNamedArgs = 0;
		EXCEPINFO excepInfo;
		memset(&excepInfo, 0, sizeof(excepInfo));
		CComVariant vaResult;
		UINT nArgErr = (UINT)-1;
		hr = jso->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, &vaResult, &excepInfo, &nArgErr);
		delete[] pVars;
		*state = hr;
		return hr;
	}
	catch(_com_error ce)
	{
		strError = ce.ErrorMessage();
		*state = hr;
		return S_FALSE;
	}
	catch(...)
	{
		*state = hr;
		return S_OK;
	}

第5步骤同时也展示了C++中调用JSObject的方法,即使用最原始的COM调用手段,MSDN上也有说明,但很不详细。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值