C++ builder 2009 怎么给生成的word添加水印

love_hate_i 2009-07-28 10:18:52
加精
在c++ builder2009中, 采用的是TWordApplication 和TWordDocument 方式生成了word文档,现在需要在文档中插入文字水印的效果

试过在word录制的VB宏,参照录制的代码,再在C++ builder中模仿实现,但是一直不对

哪位有什么好的经验分享一下

谢谢了
...全文
2722 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhourishengAA 2010-05-30
  • 打赏
  • 举报
回复
如何去掉页眉的下划线啊....
haiandj 2009-08-03
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]
BS老妖不用InterOP开发……BSBSBS!
[/Quote]
InterOP是嘛东东
chen449600885 2009-08-01
  • 打赏
  • 举报
回复
先挂名 有时间再来侃一下
ccrun.com 2009-07-30
  • 打赏
  • 举报
回复
OLE专业户来也!!!

wdApp->Connect();

// 为调试方便,将WORD界面可视
wdDoc->Application->Visible = true;

// 建立一个新文档
wdDoc->Application->Documents->Add();
wdDoc->ConnectTo(wdApp->get_ActiveDocument());

wdDoc->Application->ActiveWindow->Selection->Range->Select();
wdDoc->Application->ActiveWindow->ActivePane->View->SeekView =
WdSeekView::wdSeekCurrentPageHeader;

wdDoc->Application->Selection->HeaderFooter->Shapes->AddTextEffect(
Office_xp::MsoPresetTextEffect::msoTextEffect2,
WideString("公司绝密").c_bstr(),
WideString("宋体").c_bstr(),
1.0,
MsoTriState::msoFalse,
MsoTriState::msoFalse,
0,
0)->Select();

Word_xp::ShapeRangePtr r = wdDoc->Application->Selection->ShapeRange;

r->Name = WideString("PowerPlusWaterMarkObject1").c_bstr();
r->TextEffect->NormalizedHeight = MsoTriState::msoFalse;
r->Line->Visible = MsoTriState::msoFalse;
r->Fill->Visible = MsoTriState::msoTrue;
r->Fill->Solid();
r->Fill->Transparency = 0.5;

r->Rotation = 315;

r->LockAspectRatio = MsoTriState::msoTrue;
r->Height = wdDoc->Application->CentimetersToPoints(2.58);
r->Width = wdDoc->Application->CentimetersToPoints(18.07);

r->WrapFormat->AllowOverlap = MsoTriState::msoTrue;
r->WrapFormat->Side = Word_xp::WdWrapSideType::wdWrapLargest;
r->WrapFormat->Type = Word_xp::WdWrapType::wdWrapNone;

r->RelativeHorizontalPosition = Word_xp
::WdRelativeHorizontalPosition
::wdRelativeHorizontalPositionMargin;
r->RelativeVerticalPosition = Word_xp
::WdRelativeVerticalPosition
::wdRelativeVerticalPositionMargin;

r->Left = Word_xp::WdShapePosition::wdShapeCenter;
r->Top = Word_xp::WdShapePosition::wdShapeCenter;

wdDoc->Application->ActiveWindow->ActivePane->View->SeekView =
WdSeekView::wdSeekMainDocument;


以上是用Office组件实现的给Word文档添加水印,花去我太多的时间调试了。郁闷呢。
需要特别提醒一下:测试环境是Vista(英文) + Office2007(英文) + CBuilder2009
工程中加载的是Office xp的包,如果你的测试工程用的是Office 2k的包,需要更改代码中相应的xp为2k字样。

一定要严防死守,不能让一个BUG出现在Release版本中,否则我们在软件界说不清楚!
ccrun.com 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]
BS老妖不用InterOP开发……BSBSBS!
[/Quote]

TR老大,主要是我习惯了OLE的方式了,呵呵。
TR@SOE 2009-07-30
  • 打赏
  • 举报
回复
BS老妖不用InterOP开发……BSBSBS!
ch_builder 2009-07-30
  • 打赏
  • 举报
回复
妖弟水平越来越强大了,原来感觉水平差不多,现在感觉能差出一个泰山出来:)
love_hate_i 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ccrun 的回复:]
OLE专业户来也!!!

C/C++ codewdApp->Connect();// 为调试方便,将WORD界面可视wdDoc->Application->Visible=true;// 建立一个新文档wdDoc->Application->Documents->Add();
wdDoc->ConnectTo(wdApp->get_ActiveDocument());

wdDoc->Application->ActiveWindow->Selection->Range->Select();
wdDoc->Application->ActiveWindow->ActivePane->View->SeekView=
WdSeekView::wdSeekCurrentPageHeader;

wdDoc->Application->Selection->HeaderFooter->Shapes->AddTextEffect(
Office_xp::MsoPresetTextEffect::msoTextEffect2,
WideString("公司绝密").c_bstr(),
WideString("宋体").c_bstr(),1.0,
MsoTriState::msoFalse,
MsoTriState::msoFalse,0,0)->Select();

Word_xp::ShapeRangePtr r= wdDoc->Application->Selection->ShapeRange;

r->Name= WideString("PowerPlusWaterMarkObject1").c_bstr();
r->TextEffect->NormalizedHeight= MsoTriState::msoFalse;
r->Line->Visible= MsoTriState::msoFalse;
r->Fill->Visible= MsoTriState::msoTrue;
r->Fill->Solid();
r->Fill->Transparency=0.5;

r->Rotation=315;

r->LockAspectRatio= MsoTriState::msoTrue;
r->Height= wdDoc->Application->CentimetersToPoints(2.58);
r->Width= wdDoc->Application->CentimetersToPoints(18.07);

r->WrapFormat->AllowOverlap= MsoTriState::msoTrue;
r->WrapFormat->Side= Word_xp::WdWrapSideType::wdWrapLargest;
r->WrapFormat->Type= Word_xp::WdWrapType::wdWrapNone;

r->RelativeHorizontalPosition= Word_xp
::WdRelativeHorizontalPosition
::wdRelativeHorizontalPositionMargin;
r->RelativeVerticalPosition= Word_xp
::WdRelativeVerticalPosition
::wdRelativeVerticalPositionMargin;

r->Left= Word_xp::WdShapePosition::wdShapeCenter;
r->Top= Word_xp::WdShapePosition::wdShapeCenter;

wdDoc->Application->ActiveWindow->ActivePane->View->SeekView=
WdSeekView::wdSeekMainDocument;

以上是用Office组件实现的给Word文档添加水印,花去我太多的时间调试了。郁闷呢。
需要特别提醒一下:测试环境是Vista(英文) + Office2007(英文) + CBuilder2009
工程中加载的是Office xp的包,如果你的测试工程用的是Office 2k的包,需要更改代码中相应的xp为2k字样。

一定要严防死守,不能让一个BUG出现在Release版本中,否则我们在软件界说不清楚!
[/Quote]

谢谢妖哥!

结贴去了!
ccrun.com 2009-07-29
  • 打赏
  • 举报
回复
补充一下,测试环境为:Vista(英文) + Office 2007(英文) + BCB6.0

如果用在2009中,将以下代码
MessageBox(Handle, "启动Word出错!",
Application->Title.c_str(), MB_OK | MB_ICONERROR);


改成
MessageBox(Handle, TEXT("启动Word出错!"),
TEXT("Error"), MB_OK | MB_ICONERROR);


就可以了。
ccrun.com 2009-07-29
  • 打赏
  • 举报
回复
OLE专业户来也!!!

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant vWordApp;
try
{
vWordApp = Variant::CreateObject("Word.Application");
}
catch(...)
{
MessageBox(Handle, "启动Word出错!",
Application->Title.c_str(), MB_OK | MB_ICONERROR);
vWordApp = Unassigned;

return;
}

vWordApp.OlePropertySet("Visible", true);

// 添加新文档
vWordApp.OlePropertyGet("Documents").OleFunction("Add");

vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection")
.OlePropertyGet("Range").OleFunction("Select");
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane")
.OlePropertyGet("View").OlePropertySet("SeekView", 9); // wdSeekCurrentPageHeader

// 63 63 72 75 6E 2E 63 6F 6D
vWordApp.OlePropertyGet("Selection").OlePropertyGet("HeaderFooter")
.OlePropertyGet("Shapes").OleFunction("AddTextEffect",
1, // msoTextEffect1? "PowerPlusWaterMarkObject1"
"我要加文字水印", "宋体", 1, false, false, 0, 0).OleFunction("Select");

Variant vRange = vWordApp.OlePropertyGet("Selection").OlePropertyGet("ShapeRange");

vRange.OlePropertySet("Name", "PowerPlusWaterMarkObject1");
vRange.OlePropertyGet("TextEffect").OlePropertySet("NormalizedHeight", false);
vRange.OlePropertyGet("Line").OlePropertySet("Visible", false); // true

vRange.OlePropertyGet("Fill").OlePropertySet("Visible", true);
vRange.OlePropertyGet("Fill").OleFunction("Solid");
vRange.OlePropertyGet("Fill").OlePropertyGet("ForeColor")
.OlePropertySet("RGB", -603923969); // 这个颜色我随便写了一个
vRange.OlePropertyGet("Fill").OlePropertySet("Transparency", 0.5);

// 旋转
vRange.OlePropertySet("Rotation", 315);

vRange.OlePropertySet("LockAspectRatio", true);
vRange.OlePropertySet("Height", 2.58 * 28.346); // 厘米转磅的运算,大概乘28.346就可以了
vRange.OlePropertySet("Width", 18.07 * 28.346); // 同上

vRange.OlePropertyGet("WrapFormat").OlePropertySet("AllowOverlap", true);
vRange.OlePropertyGet("WrapFormat").OlePropertySet("Side", 3); // wdWrapNone
vRange.OlePropertyGet("WrapFormat").OlePropertySet("Type", 3);

vRange.OlePropertySet("RelativeHorizontalPosition", 0); // wdRelativeVerticalPositionMargin
vRange.OlePropertySet("RelativeVerticalPosition", 0); // wdRelativeVerticalPositionMargin

vRange.OlePropertySet("Left", -999995); // wdShapeCenter
vRange.OlePropertySet("Top", -999995); // wdShapeCenter

vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane")
.OlePropertyGet("View").OlePropertySet("SeekView", 0); // wdSeekMainDocument

ShowMessage("完成!");

// 收尾工作略去
// ...
// 自己添加
}


效果图片:
laowang2 2009-07-29
  • 打赏
  • 举报
回复
up一下。
love_hate_i 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ccrun 的回复:]
来晚了,今天事太多,楼主先在WORD中录制一段关于水印操作的宏,然后将代码贴上来吧。
[/Quote]

Sub WaterMark()
'
' WaterMark Macro
' 宏在 2009-07-29 由 录制
'
ActiveDocument.Sections(1).Range.Select
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
Selection.HeaderFooter.Shapes.AddTextEffect(PowerPlusWaterMarkObject1, _
"我要加文字水印", "宋体", 1, False, False, 0, 0).Select
Selection.ShapeRange.Name = "PowerPlusWaterMarkObject1"
Selection.ShapeRange.TextEffect.NormalizedHeight = False
Selection.ShapeRange.Line.Visible = False
Selection.ShapeRange.Fill.Visible = True
Selection.ShapeRange.Fill.Solid
Selection.ShapeRange.Fill.ForeColor.RGB = 灰色 - 25
Selection.ShapeRange.Fill.Transparency = 0.5
Selection.ShapeRange.Rotation = 315
Selection.ShapeRange.LockAspectRatio = True
Selection.ShapeRange.Height = CentimetersToPoints(2.58)
Selection.ShapeRange.Width = CentimetersToPoints(18.07)
Selection.ShapeRange.WrapFormat.AllowOverlap = True
Selection.ShapeRange.WrapFormat.Side = wdWrapNone
Selection.ShapeRange.WrapFormat.Type = 3
Selection.ShapeRange.RelativeHorizontalPosition = _
wdRelativeVerticalPositionMargin
Selection.ShapeRange.RelativeVerticalPosition = _
wdRelativeVerticalPositionMargin
Selection.ShapeRange.Left = wdShapeCenter
Selection.ShapeRange.Top = wdShapeCenter
ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
End Sub


谢谢妖哥,这么晚了还麻烦你!
(现在怎么不能在发贴时直接指定回答的专家呢)
Richardw 2009-07-29
  • 打赏
  • 举报
回复
有个程序就是用WORD做输出的,学习下,嘿嘿
woodAstone2008 2009-07-29
  • 打赏
  • 举报
回复
顶下 顺便标记下
wohoo2000 2009-07-29
  • 打赏
  • 举报
回复
学习中。。。
favorxx 2009-07-29
  • 打赏
  • 举报
回复
呵呵 妖哥真是猛
love_hate_i 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ccrun 的回复:]
汗。。。我是看着Office组件就头大啊,你再给我些时间,我去调试一下。
[/Quote]
谁叫你是妖哥呢!!!
只能找你才有解啊…………………………………………
haiandj 2009-07-29
  • 打赏
  • 举报
回复
这个嘛,可以在打印的时候使用打印机设置里的选项
ccrun.com 2009-07-29
  • 打赏
  • 举报
回复
汗。。。我是看着Office组件就头大啊,你再给我些时间,我去调试一下。
love_hate_i 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ccrun 的回复:]
OLE专业户来也!!!

C/C++ codevoid __fastcall TForm1::Button1Click(TObject*Sender)
{
Variant vWordApp;try
{
vWordApp= Variant::CreateObject("Word.Application");
}catch(...)
{
MessageBox(Handle,"启动Word出错!",
Application->Title.c_str(), MB_OK| MB_ICONERROR);
vWordApp= Unassigned;return;
}

vWordApp.OlePropertySet("Visible",true);// 添加新文档 vWordApp.OlePropertyGet("Documents").OleFunction("Add");

vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("Selection")
.OlePropertyGet("Range").OleFunction("Select");
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane")
.OlePropertyGet("View").OlePropertySet("SeekView",9);// wdSeekCurrentPageHeader// 63 63 72 75 6E 2E 63 6F 6D vWordApp.OlePropertyGet("Selection").OlePropertyGet("HeaderFooter")
.OlePropertyGet("Shapes").OleFunction("AddTextEffect",1,// msoTextEffect1? "PowerPlusWaterMarkObject1""我要加文字水印","宋体",1,false,false,0,0).OleFunction("Select");

Variant vRange= vWordApp.OlePropertyGet("Selection").OlePropertyGet("ShapeRange");

vRange.OlePropertySet("Name","PowerPlusWaterMarkObject1");
vRange.OlePropertyGet("TextEffect").OlePropertySet("NormalizedHeight",false);
vRange.OlePropertyGet("Line").OlePropertySet("Visible",false);// true
vRange.OlePropertyGet("Fill").OlePropertySet("Visible",true);
vRange.OlePropertyGet("Fill").OleFunction("Solid");
vRange.OlePropertyGet("Fill").OlePropertyGet("ForeColor")
.OlePropertySet("RGB",-603923969);// 这个颜色我随便写了一个 vRange.OlePropertyGet("Fill").OlePropertySet("Transparency",0.5);// 旋转 vRange.OlePropertySet("Rotation",315);

vRange.OlePropertySet("LockAspectRatio",true);
vRange.OlePropertySet("Height",2.58*28.346);// 厘米转磅的运算,大概乘28.346就可以了 vRange.OlePropertySet("Width",18.07*28.346);// 同上
vRange.OlePropertyGet("WrapFormat").OlePropertySet("AllowOverlap",true);
vRange.OlePropertyGet("WrapFormat").OlePropertySet("Side",3);// wdWrapNone vRange.OlePropertyGet("WrapFormat").OlePropertySet("Type",3);

vRange.OlePropertySet("RelativeHorizontalPosition",0);// wdRelativeVerticalPositionMargin vRange.OlePropertySet("RelativeVerticalPosition",0);// wdRelativeVerticalPositionMargin
vRange.OlePropertySet("Left",-999995);// wdShapeCenter vRange.OlePropertySet("Top",-999995);// wdShapeCenter
vWordApp.OlePropertyGet("ActiveWindow").OlePropertyGet("ActivePane")
.OlePropertyGet("View").OlePropertySet("SeekView",0);// wdSeekMainDocument
ShowMessage("完成!");// 收尾工作略去// ...// 自己添加}

效果图片:

[/Quote]
我是采用的TWordApplication 方式;
头文件中定义:
TWordApplication *wdApp;
TWordDocument *wdDoc;

实现为:
Word_xp::Paragraph *prgh;//段落指针

wdApp->Connect();

// 为调试方便,将WORD界面可视
wdApp->set_Visible(true);

// 建立一个新文档
wdApp->Documents->Add();
wdDoc->ConnectTo(wdApp->get_ActiveDocument());

wdDoc->Sections->Item(Variant(1))->Range->Select();
wdDoc->ActiveWindow->ActivePane->View->SeekView = 9;//wdSeekCurrentPageHeader;

Office_xp::MsoPresetTextEffect PresetTextEffect;
Word_xp::Shape *prop;
wdDoc->Application->Selection->HeaderFooter->Shapes->AddTextEffect(PresetTextEffect,
(BSTR)"公司绝密",
(BSTR)"宋体",
1.0,
(MsoTriState)true,
(MsoTriState)false,
0.0,
0.0,
(VARIANT*)NULL,
&prop);
wdDoc->Application->Selection->ShapeRange->Name = L"PresetTextEffect";
wdDoc->Application->Selection->ShapeRange->TextEffect->NormalizedHeight = false;
wdDoc->Application->Selection->ShapeRange->Line->Visible = false;
wdDoc->Application->Selection->ShapeRange->Fill->Visible = true;
wdDoc->Application->Selection->ShapeRange->Fill->Solid();
Word_xp::ColorFormatPtr clpro;
Word_xp::ShapeRangePtr ShapRang;
//wdDoc->Application->Selection->HeaderFooter->Shapes->AddShape()

clpro->set_Yellow(0xF9E2D5);
//wdDoc->Application->Selection->ShapeRange->Fill->ForeColor = clpro;
wdDoc->Application->Selection->ShapeRange->Fill->Transparency = 0.5;
wdDoc->Application->Selection->ShapeRange->Rotation = 315;
wdDoc->Application->Selection->ShapeRange->LockAspectRatio = true;
//wdDoc->Application->Selection->ShapeRange->Height = CentimetersToPoints(4.13);
//wdDoc->Application->Selection->ShapeRange->Width = CentimetersToPoints(16.52);
wdDoc->Application->Selection->ShapeRange->WrapFormat->AllowOverlap = true;
wdDoc->Application->Selection->ShapeRange->WrapFormat->Side = 3;//wdWrapNone
//wdDoc->Application->Selection->ShapeRange->Type = 3;

wdDoc->Application->Selection->ShapeRange->RelativeHorizontalPosition = 0;//wdRelativeVerticalPositionMargin;
wdDoc->Application->Selection->ShapeRange->RelativeVerticalPosition = 0;//wdRelativeVerticalPositionMargin;
wdDoc->Application->Selection->ShapeRange->Left = 0xFFF0BDC5;//wdShapeCenter
wdDoc->Application->Selection->ShapeRange->Top = 0xFFF0BDC5;//wdShapeCenter;
wdDoc->ActiveWindow->ActivePane->View->SeekView = 0; //wdSeekMainDocument

但是不对呢,妖哥帮帮,
你的OLE方式我试过了,倒是对的,但是我生成word的代码都写完了,都采用的TWordApplication
加载更多回复(9)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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