将word转换为图片(请妖哥贴代码)

bigfog 2012-09-25 07:57:05
妖哥,把你的代码分享一下,谢谢!
...全文
266 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿发伯 2012-09-27
  • 打赏
  • 举报
回复
顶妖哥!
ccrun.com 2012-09-27
  • 打赏
  • 举报
回复
代码说明:
以上代码是刚修改过的, 只针对Word文档中的某页进行处理, 并且删除了注释. 保存多个页的函数和加注释的代码, 暂不贴出.
测试环境:
Windows 8 + Office 2010
Windows XP + Office 2003

工作皆正常.
ccrun.com 2012-09-27
  • 打赏
  • 举报
回复
OLE专业户来也!!! 楼主等久了吧. 直接上代码:

#include <stdio.h>

// ---------------------------------------------------------------------------
BOOL __stdcall CrnWmfToBmp(LPCSTR lpWmfFile, LPCSTR lpBmpFile)
{
BOOL bResult = FALSE;
if (!FileExists(lpWmfFile)) return bResult;

TMetafile *pMetafile = new TMetafile;
Graphics::TBitmap *pBitmap = new Graphics::TBitmap;
pBitmap->PixelFormat = pf24bit;

try
{
pMetafile->LoadFromFile(lpWmfFile);

pBitmap->Height = pMetafile->Height;
pBitmap->Width = pMetafile->Width;
pBitmap->Canvas->Draw(0, 0, pMetafile);

pBitmap->SaveToFile(lpBmpFile);

bResult = TRUE;
}
__finally
{
delete pBitmap;
delete pMetafile;
}

return bResult;
}

//---------------------------------------------------------------------------
BOOL __fastcall CrnSaveDocPageToSingleBitmap(LPCSTR lpDocFile, int nPage, LPCSTR lpBmpFile)
{
if (!FileExists(lpDocFile)) return FALSE;

Variant vWordApp;
try
{
vWordApp = Variant::CreateObject("Word.Application");
}
catch(...)
{
MessageBox(NULL, "启动Word出错!",
Application->Title.c_str(), MB_OK | MB_ICONERROR);

return FALSE;
}

vWordApp.OlePropertySet("Visible", false);
vWordApp.OlePropertySet("DisplayAlerts", false);

Variant vDoc = vWordApp.OlePropertyGet("Documents").
OleFunction("Open", WideString(lpDocFile));
vDoc.OleProcedure("Repaginate");

Variant vSelect, vParam, vNewDoc;
vNewDoc = vWordApp.OlePropertyGet("Documents").OleFunction("Add");

vDoc.OleProcedure("Activate");

vSelect = vWordApp.OlePropertyGet("Selection");
vSelect.OleFunction("GoTo", 1, 2, 1, nPage);

vSelect.OleFunction("EndKey", 6, 1);

vSelect.OleProcedure("Copy");

vNewDoc.OleProcedure("Activate");

// 63 63 72 75 6E 2E 63 6F 6D
vWordApp.OlePropertyGet("Selection").OleProcedure("PasteSpecial",
vParam.NoParam(),
false,
0,
false,
9,
vParam.NoParam(),
vParam.NoParam()
);

vNewDoc.OlePropertyGet("InlineShapes").OleFunction("Item", 1).OleProcedure("Select");

vWordApp.OlePropertyGet("Selection").OleProcedure("Copy");

::OpenClipboard(0);
HANDLE hEmf = ::GetClipboardData(CF_ENHMETAFILE);
if (hEmf)
{
char szEmfFile[MAX_PATH];
strcpy(szEmfFile, ChangeFileExt(lpBmpFile, ".emf").c_str());

HENHMETAFILE h = CopyEnhMetaFile(hEmf, szEmfFile);
if (h > 0)
{
::DeleteEnhMetaFile(h);

CrnWmfToBmp(szEmfFile, lpBmpFile);

::DeleteFile(szEmfFile);
}
}
::CloseClipboard();

vWordApp.OlePropertyGet("Selection").OleProcedure("Delete");

vWordApp.OleProcedure("Quit", 0);

return TRUE;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;

String strPath = ExtractFilePath(ParamStr(0));

// 将123.doc文件的第2页保存为位图
CrnSaveDocPageToSingleBitmap("D:\\ccrun\\123.doc", 2, "D:\\ccrun\\123.bmp");

Button1->Enabled = true;
}
bigfog 2012-09-27
  • 打赏
  • 举报
回复
没事,已经看明白了,谢谢!
ccrun.com 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
能转一页,那多页就简单了,谢谢妖哥
[/Quote]

是的,举一反三,自己研究一下吧。代码我就不发全了。
bigfog 2012-09-27
  • 打赏
  • 举报
回复
能转一页,那多页就简单了,谢谢妖哥
ccrun.com 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
顶妖哥!
[/Quote]

惭愧,很久不见阿发伯了。
ccrun.com 2012-09-26
  • 打赏
  • 举报
回复
昨天有事没在公司,今天忘了贴,明天上午吧。
bigfog 2012-09-26
  • 打赏
  • 举报
回复
帖沉下去了,顶起来
继续等待妖哥的代码....
ccrun.com 2012-09-25
  • 打赏
  • 举报
回复
下午再给你贴,现在代码不在手头。
bigfog 2012-09-25
  • 打赏
  • 举报
回复
好的,谢谢
等你贴了就结帖

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧