目的:office文件转换为PDF或SWF,最终可使用Flexpaper调用adobe flash player进行浏览

 

放弃两个文件转换工具:

1.FlashPaper,转换出的文件由于自带工具栏,无法控制打印等操作;

程序中进行命令行调用时,依赖MSOffice及adobe reader,对于环境依赖比较大

2.print2flash,代码中调用必须使用server版本(5000¥),未有破解

 

最终方案:

OpenOffice+JodConverter+SWFtools(office文件→PDF→SWF)

环境配置要求:

jre 1.4以上(JodConverter依赖)

 

office文件→PDF

在java中可以直接调用JodConverter类库执行

delphi中可调用JodConverter的可执行文件jar+命令行参数

命令行实例:

java -jar "D:\jodconverter-2.2.2\lib\jodconverter-cli-2.2.2.jar" "D:\业务部\1.doc" "D:\业务部\1.pdf"

 

PDF→SWF

调用swftools中的pdf2swf.exe+命令行参数(包括中文字体包位置,中文字体包位置需自行设置)

具体见:http://blog.csdn.net/fh13760184/article/details/4100421

命令行实例

D:\SWFTools\pdf2swf.exe  -o "D:\业务部\1.swf" -t "D:\业务部\1.pdf" -s languagedir="D:\xpdf\chinese-simplified"

 

delphi中的关键代码,思路是每条转换任务作为一个线程,进程中创建一个进程,进程结束就表示任务结束

procedure StopProcess(ProcessID: DWORD);
var
  Handle: THandle;
begin
  Handle := OpenProcess(PROCESS_TERMINATE or PROCESS_VM_READ, False, ProcessID);
  if Handle <> 0 then
  try
    TerminateProcess(Handle, 0);
    WaitForSingleObject(Handle, INFINITE);
  finally
    CloseHandle(Handle);
  end;
end;

procedure TFileConvertThread.Execute;
var

  pInfo: TProcessInformation;
  StartInfo: TStartupInfo;
  Path: array[0..MAX_PATH - 1] of Char;
  cmdLines: string;
  fileExName: string;
  dw: HWND;

begin
  inherited;
  FillChar(StartInfo, sizeof(StartInfo), 0);
  StartInfo.cb := sizeof(StartInfo);

  StartInfo.wShowWindow := SW_HIDE; //隐藏命令行窗口
  StartInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartInfo.hStdError := 0;
  StartInfo.hStdInput := 0;
  StartInfo.hStdOutput := 0;

  cmdLines :='java -jar "D:\jodconverter-2.2.2\lib\jodconverter-cli-2.2.2.jar" "D:\业务部\1.doc" "D:\业务部\1.pdf"';
  //cmdLines :='D:\SWFTools\pdf2swf.exe  -o "D:\业务部\1.swf" -t "D:\业务部\1.pdf" -s languagedir="D:\xpdf\chinese-simplified"';
  //打开一个进程
  CreateProcess(nil, PAnsiChar(cmdLines), nil, nil, False, 0, nil, nil,
    StartInfo, pInfo);

  FSysPid := pInfo.dwProcessId; //获取系统进程pid
  dw := WaitForSingleObject(pInfo.hProcess, 120000); //120000表示超时时间为2分钟,等待进程执行的信号状态

  case dw of
    WAIT_OBJECT_0: // 进程正常执行完毕
      begin
        //  '转换成功!'
      end;
    WAIT_TIMEOUT: // 进程执行超时
      begin
        //'转换超时!'; 此处可kill pid
        StopProcess(FSysPid);
      end;
    WAIT_FAILED: // 进程执行失败
      begin
       // '转换失败!';
      end
  end;
end;

posted on 2013-09-17 10:01  宅神的小铺  阅读(966)  评论(2编辑  收藏  举报