//有网友问起怎么解决的,这是我后来改的整个function,现在看看垃圾得很。仅供参考。//因为要指定虚拟打印机打印,打印成文件到某个地方,所以,看代码的请注意。看不懂别骂娘。
function tForm1.convertToTiffOle(const fname, VPrinter, VPrintPath: string): string;
var
tname: string; //临时文件名
//fsTemp:SHFILEOPSTRUCT;
xName: string; // 扩展名
//OLE 变量
ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert,
WritePasswordDocument, WritePasswordTemplate, Format, Encoding,Visible: OleVariant; MsWord{, MsDoc} : Variant; //应用程序对象
filename: OleVariant;
ItemIndex :OleVariant; tpath: string; //临时路径
eii, ejj, jll, ill, iji: integer;
ej : boolean;
OLEInt: OleVariant; Device: array[0..255] of Char; //打印机设备
Driver: array[0..255] of char;
Port: array[0..255] of char;
s : array[0..255] of Char;
s1: array[0..255] of Char;
PrChanged: boolean; //更改默认打印机标识
PrIndex: integer;
hDeviceMode: THandle; jjjj: integer;
{tempName,} ttttt, sstate: string;
//tempfile: file;begin
begin sstate:='';
xName:=ExtractFileExt(fname); //取扩展名
if sametext(XName,'.htm') or sametext(xname, '.html') or sametext(XName,'.dot') or sametext(xname, '.rtf') or sametext(XName,'.doc') or sametext(xname, '.txt') or sametext(XName,'.wri') or (sametext(xName,'.xls')) or (sametext(xName,'.xlt')) or SameText(xName, '.ppt') or SameTExt(xName, '.pps') or SameTExt(xName, '.pot') or SameTExt(xName, '.pre') then
begin // 是支持的文件格式
try
PrChanged:= false;
fileName:= fname;
PrIndex:= 0;
//result:='';
while fileInUse(fname) do
begin
if MessageBox(handle, '该文件已被打开,请先关闭。','无法打开',MB_ReTRYCancel) = IDCancel then
begin
result:='NoWord';
exit;
break;
end
else
result:='';
end;
{for i := 0 to pred(Printer.Printers.Count) do
begin
showmessage(Printer.Printers.Strings[i]);
end;}
if Printer.Printers.IndexOf(VPrinter) < 0 //找不到参数指定的虚拟打印机。
then
begin
MessageBox(0, '请安装虚拟打印机。', pchar(Vprinter), MB_IconWarning);
result:= '';
exit;
end;
if Printer.PrinterIndex < 0 //当前系统没有指定默认打印机
then Printer.PrinterIndex := Printer.Printers.IndexOf(VPrinter) //直接指定虚拟打印机为系统默认打印机,不做标记
else //系统指定了默认打印机
if Printer.PrinterIndex <> Printer.Printers.IndexOf(VPrinter) //默认打印机不是参数指定的虚拟打印机
then
begin
Printer.GetPrinter (Device, Driver, Port, hDeviceMode); //取当前默认打印机信息,用于打印完毕后恢复此值。
StrCopy (s1, Device);
StrCat (s1, ',');
StrCat (s1, Driver);
StrCat (s1, ',');
StrCat (s1, Port);
PrIndex:= Printer.PrinterIndex;
Printer.PrinterIndex := Printer.Printers.IndexOf(VPrinter); //更改默认打印机为参数指定的虚拟打印机 Printer.GetPrinter (Device, Driver, Port, hDeviceMode); //取新的默认打印机信息用于发消息通知系统。
StrCopy (s, Device);
StrCat (s, ',');
StrCat (s, Driver);
StrCat (s, ',');
StrCat (s, Port);
WriteProfileString ('windows', 'device', s);
StrCopy (s, 'windows');
SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@s)); //发消息通知系统,“默认打印机”已更改。
PrChanged:=true; //设标记为真。
end;
Xname:=ExtractFileExt(fname); //求取改扩展为.tif后的文件名。循环以避免原文件中带有'.'号的情况。
tName := Extractfilename(fName);
ttttt := 'jimttttt';
while tName <> ttttt do
begin
if ttttt<> 'jimttttt' then tName := ttttt ;
ttttt := changeFileExt(tname, '');
end; tName:=tname + '.tif'; if sametext(XName,'.htm') or sametext(xname, '.html') or sametext(XName,'.dot') or sametext(xname, '.rtf') or sametext(XName,'.doc') or sametext(xname, '.txt') or sametext(XName,'.wri') then
tPath:='Microsoft Word - '+tName
else
if SameText(Xname, '.ppt') or SameTExt(Xname, '.pps') or SameTExt(Xname, '.pot') or SameTExt(Xname, '.pre') then
tPath:='Microsoft Word - '+tName
else
tpath:=tName; PrintFileName := tPath; tPath:=VPrintPath+tPath; //打印输出的目标文件名。 if FileExists(tPath) then DeleteFile(tPath); //调用word打印。
if sametext(XName,'.htm') or sametext(xname, '.html') or sametext(XName,'.dot') or sametext(xname, '.rtf') or sametext(XName,'.doc') or sametext(xname, '.txt') or sametext(XName,'.wri') then
begin
try
try
if not VarIsEmpty(MSword) then //如果对象已存在。
begin
MSword.DisplayAlerts := False;
MSword.Quit;
VarClear(MSword);
end; MSword := CreateOleObject('Word.Application'); //创建OLE应用程序实例。
except
raise EMathError.Create('您的系统上可能没有安装MS Word,文件无法转换。');
end;
try
//打开文档的参数设置
ConfirmConversions := False;
ReadOnly := false;
AddToRecentFiles := False;
PasswordDocument := '';
PasswordTemplate := '';
Revert := false;
WritePasswordDocument := '';
WritePasswordTemplate := '';
format := 0;
Encoding := 1;
Visible := True;
//打开文档。
MsWord.Documents.Open
( FileName, ConfirmConversions,
ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format, Encoding,Visible );
ItemIndex := 1; //指定文档索引
MsWord.Options.CheckSpellingAsYouType := False;
MsWord.Options.CheckGrammarAsYouType := False;
MsWord.PrintOut; //打印输出。
for jjjj:= 0 to 1800 do //定时循环
begin
if fileExists(tpath) then
break; //文件打印完毕则退出循环
sleep(50);
end;
finally
MsWord.ActiveDocument.close; //关闭文档
MsWord.Quit(); //退出应用
end;
except
on E: Exception do
begin
WriteLog(4, E.Message);
sstate:='NoWord';
end; end; end
///////////////to be continued.....
function tForm1.convertToTiffOle(const fname, VPrinter, VPrintPath: string): string;
var
tname: string; //临时文件名
//fsTemp:SHFILEOPSTRUCT;
xName: string; // 扩展名
//OLE 变量
ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert,
WritePasswordDocument, WritePasswordTemplate, Format, Encoding,Visible: OleVariant; MsWord{, MsDoc} : Variant; //应用程序对象
filename: OleVariant;
ItemIndex :OleVariant; tpath: string; //临时路径
eii, ejj, jll, ill, iji: integer;
ej : boolean;
OLEInt: OleVariant; Device: array[0..255] of Char; //打印机设备
Driver: array[0..255] of char;
Port: array[0..255] of char;
s : array[0..255] of Char;
s1: array[0..255] of Char;
PrChanged: boolean; //更改默认打印机标识
PrIndex: integer;
hDeviceMode: THandle; jjjj: integer;
{tempName,} ttttt, sstate: string;
//tempfile: file;begin
begin sstate:='';
xName:=ExtractFileExt(fname); //取扩展名
if sametext(XName,'.htm') or sametext(xname, '.html') or sametext(XName,'.dot') or sametext(xname, '.rtf') or sametext(XName,'.doc') or sametext(xname, '.txt') or sametext(XName,'.wri') or (sametext(xName,'.xls')) or (sametext(xName,'.xlt')) or SameText(xName, '.ppt') or SameTExt(xName, '.pps') or SameTExt(xName, '.pot') or SameTExt(xName, '.pre') then
begin // 是支持的文件格式
try
PrChanged:= false;
fileName:= fname;
PrIndex:= 0;
//result:='';
while fileInUse(fname) do
begin
if MessageBox(handle, '该文件已被打开,请先关闭。','无法打开',MB_ReTRYCancel) = IDCancel then
begin
result:='NoWord';
exit;
break;
end
else
result:='';
end;
{for i := 0 to pred(Printer.Printers.Count) do
begin
showmessage(Printer.Printers.Strings[i]);
end;}
if Printer.Printers.IndexOf(VPrinter) < 0 //找不到参数指定的虚拟打印机。
then
begin
MessageBox(0, '请安装虚拟打印机。', pchar(Vprinter), MB_IconWarning);
result:= '';
exit;
end;
if Printer.PrinterIndex < 0 //当前系统没有指定默认打印机
then Printer.PrinterIndex := Printer.Printers.IndexOf(VPrinter) //直接指定虚拟打印机为系统默认打印机,不做标记
else //系统指定了默认打印机
if Printer.PrinterIndex <> Printer.Printers.IndexOf(VPrinter) //默认打印机不是参数指定的虚拟打印机
then
begin
Printer.GetPrinter (Device, Driver, Port, hDeviceMode); //取当前默认打印机信息,用于打印完毕后恢复此值。
StrCopy (s1, Device);
StrCat (s1, ',');
StrCat (s1, Driver);
StrCat (s1, ',');
StrCat (s1, Port);
PrIndex:= Printer.PrinterIndex;
Printer.PrinterIndex := Printer.Printers.IndexOf(VPrinter); //更改默认打印机为参数指定的虚拟打印机 Printer.GetPrinter (Device, Driver, Port, hDeviceMode); //取新的默认打印机信息用于发消息通知系统。
StrCopy (s, Device);
StrCat (s, ',');
StrCat (s, Driver);
StrCat (s, ',');
StrCat (s, Port);
WriteProfileString ('windows', 'device', s);
StrCopy (s, 'windows');
SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@s)); //发消息通知系统,“默认打印机”已更改。
PrChanged:=true; //设标记为真。
end;
Xname:=ExtractFileExt(fname); //求取改扩展为.tif后的文件名。循环以避免原文件中带有'.'号的情况。
tName := Extractfilename(fName);
ttttt := 'jimttttt';
while tName <> ttttt do
begin
if ttttt<> 'jimttttt' then tName := ttttt ;
ttttt := changeFileExt(tname, '');
end; tName:=tname + '.tif'; if sametext(XName,'.htm') or sametext(xname, '.html') or sametext(XName,'.dot') or sametext(xname, '.rtf') or sametext(XName,'.doc') or sametext(xname, '.txt') or sametext(XName,'.wri') then
tPath:='Microsoft Word - '+tName
else
if SameText(Xname, '.ppt') or SameTExt(Xname, '.pps') or SameTExt(Xname, '.pot') or SameTExt(Xname, '.pre') then
tPath:='Microsoft Word - '+tName
else
tpath:=tName; PrintFileName := tPath; tPath:=VPrintPath+tPath; //打印输出的目标文件名。 if FileExists(tPath) then DeleteFile(tPath); //调用word打印。
if sametext(XName,'.htm') or sametext(xname, '.html') or sametext(XName,'.dot') or sametext(xname, '.rtf') or sametext(XName,'.doc') or sametext(xname, '.txt') or sametext(XName,'.wri') then
begin
try
try
if not VarIsEmpty(MSword) then //如果对象已存在。
begin
MSword.DisplayAlerts := False;
MSword.Quit;
VarClear(MSword);
end; MSword := CreateOleObject('Word.Application'); //创建OLE应用程序实例。
except
raise EMathError.Create('您的系统上可能没有安装MS Word,文件无法转换。');
end;
try
//打开文档的参数设置
ConfirmConversions := False;
ReadOnly := false;
AddToRecentFiles := False;
PasswordDocument := '';
PasswordTemplate := '';
Revert := false;
WritePasswordDocument := '';
WritePasswordTemplate := '';
format := 0;
Encoding := 1;
Visible := True;
//打开文档。
MsWord.Documents.Open
( FileName, ConfirmConversions,
ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format, Encoding,Visible );
ItemIndex := 1; //指定文档索引
MsWord.Options.CheckSpellingAsYouType := False;
MsWord.Options.CheckGrammarAsYouType := False;
MsWord.PrintOut; //打印输出。
for jjjj:= 0 to 1800 do //定时循环
begin
if fileExists(tpath) then
break; //文件打印完毕则退出循环
sleep(50);
end;
finally
MsWord.ActiveDocument.close; //关闭文档
MsWord.Quit(); //退出应用
end;
except
on E: Exception do
begin
WriteLog(4, E.Message);
sstate:='NoWord';
end; end; end
///////////////to be continued.....
解决方案 »
- 点数散尽,只为求解:一个关于DevExpress百思不得其解的问题
- 急!!!!!!!!!!!请问这句话错在哪??????????????
- 如何编程实现“判断一个程序是用的什么编译器”
- 据说有点难的问题,如何触发树的Onchecked事件。
- 难题,制作的ActiveX组件如何接受asp从sqlserver image类型数据
- NetGetDCName和NetApiBufferFree的使用问题
- EXCEL保存问题,Xl9597对应的常量是多少?
- 如何通过传递地址的方式来调用一个integer的DLL?指计??
- 这四个问题(其实就是一个)即将给分(390),敬请关注.
- 硬盘有坏道,影响启动,废物利用,用什么硬盘管理软件,可多建几个分区,绕开坏道?
- 100分求线程,多线程方面的例子,高手狂进啊!!
- 有用delphi开发过视频卡的朋友请联系我,必有重谢
begin
try
try
if not VarIsEmpty(MSword) then //如果对象已存在。
begin
MSword.DisplayAlerts := False;
MSword.Quit;
VarClear(MSword);
end; MSword := CreateOleObject('Excel.Application'); except
raise EMathError.Create('您的系统上可能没有安装MS Excel,文件无法转换。'); //创建OLE应用程序实例。
end;
try
ReadOnly := false;
OleInt:= 1;
MSword.Workbooks.Open //打开文档。
(FileName);
ill:=1;
jll:=1;
while ill <= MSword.WorkSheets.count do //循环打印所有的工作表。
begin
ej:= false;
MSword.WorkSheets[ill].Activate; //激活当前工作表
for eii:= 1 to 15 do //15列,50行内取不到数据则判断此工作表为空表,不打印。
begin
if ej then break;
for ejj:= 1 to 50 do
begin
if MSWord.WorkSheets[ill].cells[ejj, eii].value <> '' then begin ej:=true; break; end;
end;
end;
if not ej then //工作表为空。
begin
//ShowMessage(intToStr(ill));
inc(ill);
continue;
end;
if jll=1 then //当前是第一张工作表则直接打印。
begin
MSword.ActiveSheet.PrintOut;
end
else
begin //当前不是第一张工作表
try
for jjjj:= 0 to 200 do //循环等待,以确保打印已完毕,文件可重命名。
begin //重命名打印后文件,成功则跳出循环。
if renamefile(vprintpath+ stringReplace(extractfilename(fname),extractFileext(fname), '.tif',[]),vprintpath+ 'jimtempsji.tif') then break;
sleep(100); //等待
end;
MSword.ActiveSheet.PrintOut; //打印当前工作表。
for jjjj:= 0 to 200 do //循环等待,以确保打印已完毕,文件可重命名。
begin
if renamefile(vprintpath + changefileext(extractfilename(fname),'.tif'),vprintpath+ 'jimteseewwmpsji.tif') then
begin //重命名打印后文件,成功则跳出循环。
renamefile(vprintpath+ 'jimteseewwmpsji.tif',vprintpath + changefileext(extractfilename(fname),'.tif'));
break;
end;
sleep(100); //等待
end;
InsertTIFFImageFile(vprintpath+ changefileext(extractfilename(fname),'.tif'),vprintpath+ 'jimtempsji.tif',vprintpath+ 'jimtempsjiss.tif',0); //合并tiff文件。
deletefile(pchar( vprintpath+ changefileext(extractfilename(fname),'.tif') )); //删除tiff文件
deletefile(pchar( vprintpath+ 'jimtempsji.tif'));
renamefile(vprintpath+ 'jimtempsjiss.tif', vprintpath+ changefileext(extractfilename(fname),'.tif')); //重命名文件
except
On E: exception do
begin
writeLog(1, e.Message +vprintpath+ changefileext(extractfilename(fname),'.tif')+' : '+vprintpath+ 'jimtempsji.tif'+' : '+vprintpath+ 'jimtempsjiss.tif');
MSword.Quit;
raise;
end;
end;
end;
inc(ill);
inc(jll);
end; //循环
MSword.Workbooks.Close; //关闭工作簿
finally
MSword.Quit; //退出应用
end;
except
On E: exception do
begin
sstate:='NoWord';
WriteLog(4, E.Message);
end;
end;
end
else if SameText(Xname, '.ppt') or SameTExt(Xname, '.pps') or SameTExt(Xname, '.pot') or SameTExt(Xname, '.pre') then
begin
exit; ///此功能已取消。
try
try
if not VarIsEmpty(MSWord) then
begin
MSWord.DisplayAlerts := False;
MSWord.Quit;
VarClear(MSWord);
end;
raise EMathError.Create('您的系统上可能没有安装MS PowerPoint,文件无法转换。');
end;
try
ReadOnly := false;
MSWord.Presentations.Open
(fName,ReadOnly,ReadOnly,ReadOnly);
//ItemIndex := 1;
//readOnly:=true;
//MyApp.presentations.PrintOptions.FitToPage:=readOnly;
//readOnly:=false;
//MyApp.presentations('faff').windows(1).activate;
//MyApp.activepresentation.PrintOut;
//MSWord.ConnectTo(MSWord.Presentations.Item (ItemIndex));
//ppp.
//MsWord.presentations.saveas('temp');
//MSWord.presentations(0).windows(1).activate; //MsWord.presentations.activate;
MSWord.ActivePresentation.PrintOut; /// (1, MSWord.Slides.Count ,'',1,ReadOnly); finally
//MsWord.ActivePresentation.close;
{MyApp.Quit;
MyApp.Disconnect; }
//MSWord.Disconnect;
MSWord.quit;
end;
except
On E: exception do
begin
sstate:='NoWord';
writeLog(4, E.Message);
end;
end;
end
else
begin
sstate:='NoWord';
end; if PrChanged then
begin
//ShowMessage('');
Printer.PrinterIndex:=prIndex;
WriteProfileString ('windows', 'device', s1);
StrCopy (s1, 'windows');
SendMessage (HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@s1));
end;
if sametext(sstate,'NoWord') then exit; //出错则退出。 tName:=GetCurrentDirEx + 'temp\'+tname;
if Fileexists(tName) then
begin
iji:= 1;
tName:=Stringreplace(tName,'.tif','1.tif',[rfReplaceAll,rfIgnorecase]);
while fileExists(tName) do //循环,当目标文件已存在,则自动更改文件名。
begin
tName:=Stringreplace(tName,intToStr(iji)+'.tif',intToStr(iji+ 1)+'.tif',[rfReplaceAll,rfIgnorecase]); //文件名后加数字。
inc(iji);
end;
end;
for jjjj:= 0 to 100 do //循环等待,超时则失败。
begin
if MoveFile(pchar(tPath),Pchar( tName)) then //移动文件。
begin
break; //成功移动文件,退出循环。
end;
if jjjj=100 then //超时。
begin
writeLog(3, '无法转换文件,请重试。');
sstate:='err';
exit;
end;
sleep(100);
// end;
end;
finally
end;
// 已经转换为图片了。
end
else
if (sametext(xName,'.bmp')) or (sametext(xName,'.gif')) or (sametext(xName,'.png')) or (sametext(xName,'.wmf')) or (sametext(xName,'.emf')) or (sametext(xName,'.jpg')) or (sametext(xName,'.jpeg')) or (sametext(xName,'.ico')) then
begin //原文件为图片格式。
ImageEnIO1.LoadFromFile(fname); //加载图片到ImageEn.
if not DirectoryExists(GetCurrentDirEx+'temp') then //临时目录不存在,则创建。
mkdir(pchar(GetCurrentDirEx+'temp'));
tName:= ChangeFileExt(extractfilename(fname),'.tif');
tName:= GetCurrentDirEx+'temp\'+ tname; //'f:\abc\tim.tif';
if Fileexists(tName) then
begin //目标文件存在则生成新的文件名
iji:= 1;
tName:=Stringreplace(tName,'.tif','1.tif',[rfReplaceAll,rfIgnorecase]);
while fileExists(tName) do
begin
tName:=Stringreplace(tName,intToStr(iji)+'.tif',intToStr(iji+ 1)+'.tif',[rfReplaceAll,rfIgnorecase]);
inc(iji);
end;
end;
ImageEnIO1.SaveToFileTIFF(tName); //保存成tiff格式.
end
else
if sametext(xName,'.tif') or sameText(xname,'.tiff') then
begin
if fileexists(fname) then
begin
sstate:=fname; //返回文件名。
end
else
begin
sstate:='err';
exit;
end;
end;
end;
if sstate= '' then
result:=tName
else if sstate='err' then
result:=''
else
result:=fName;
end;