zoukankan      html  css  js  c++  java
  • Delphi下使用OpenOffice+JodConverter+SWFtools进行文件转换

    目的: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.2libjodconverter-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:SWFToolspdf2swf.exe  -o "D:业务部1.swf" -t "D:业务部1.pdf" -s languagedir="D:xpdfchinese-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.2libjodconverter-cli-2.2.2.jar" "D:业务部1.doc" "D:业务部1.pdf"';
      //cmdLines :='D:SWFToolspdf2swf.exe  -o "D:业务部1.swf" -t "D:业务部1.pdf" -s languagedir="D:xpdfchinese-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;

  • 相关阅读:
    SQL Server DB 基于多核CPU的设置
    如何在64位的Windows 2008的系统配置导入Excel功能
    如果在IIS中没有将虚拟目录配置为应用程序,则可能导致此错误
    .NET 数据绑定中空格符的问题
    .net 读取客户端文件的方法
    spring4+quartz
    web端 图片上传
    Maven配置setting.xml详细说明
    Timer
    实现quartz定时器及quartz定时器原理介绍
  • 原文地址:https://www.cnblogs.com/Closeyes/p/3325695.html
Copyright © 2011-2022 走看看