文档在线预览:文档生成技术细节

文档在线预览研究系列
总体思路
文档生成技术细节
利用百度阅读器


  之前的“ 文档在线预览:总体思路”受到很多朋友的欢迎,为此我继续讲一下文档在线预览两个步骤的一些技术细节。以下我以C#语言和Windows平台为例展开做一些介绍。
  请记住,本文讲的是文档转化为pdf再转化为其他格式的方法,不讨论转化成的flash如何展示的问题(暂且假设用FlexPaper来展示吧)。 文章后面附带本文讲到的相关操作的源码和软件下载,有些软件需要购买授权才能使用。

四项基本操作
1、调用Windows打印机打印文档
            PrintDocument docToPrint  =   new  PrintDocument();
            docToPrint.DocumentName 
=  GetPath(sourcePath);
            
// 开始打印
            docToPrint.Print();

 

2、调用命令行执行CMD命令
ExpandedBlockStart.gif 代码
         ///   <summary>
        
///  运行命令
        
///   </summary>
        
///   <param name="strShellCommand"> 命令字符串 </param>
        
///   <returns> 命令运行时间 </returns>
         private   static   double  RunShell( string  strShellCommand)
        {
            
double  spanMilliseconds  =   0 ;
            DateTime beginTime 
=  DateTime.Now;

            Process cmd 
=   new  Process();
            cmd.StartInfo.FileName 
=   " cmd.exe " ;
            cmd.StartInfo.UseShellExecute 
=   false ;
            cmd.StartInfo.CreateNoWindow 
=   true ;
            cmd.StartInfo.Arguments 
=  String.Format( @" /c {0} " , strShellCommand);
            cmd.Start();
            cmd.WaitForExit();


            DateTime endTime 
=  DateTime.Now;
            TimeSpan timeSpan 
=  endTime  -  beginTime;
            spanMilliseconds 
=  timeSpan.TotalMilliseconds;

            
return  spanMilliseconds;
        }

 

 3、检查文件是否生成完毕

ExpandedBlockStart.gif 代码
         ///   <summary>
        
///  检查是否转换成功(文件是否生成完毕)
        
///   </summary>
        
///   <param name="sourcePath"> 要检查文件地址 </param>
        
///   <param name="targetPath"> 要复制到的地址(如果不需要真正复制,请跟sourcePath一致) </param>
        
///   <param name="timeout"> 最大等待时间 </param>
        
///   <returns></returns>
         private   static   bool  IsParseSuccess( string  sourcePath,  string  targetPath,  int  timeout)
        {
            
bool  isSuccess  =   false ;

            
if  (timeout  <=   0 )
                timeout 
=   30 ;

            
int  i  =   0 ;
            
while  ( ! RenameFile(sourcePath, targetPath))
            {
                Thread.Sleep(
1000 );
                i
++ ;
                
if  (i  ==  timeout)
                    
break ;
            }
            
if  (i  <  timeout)
                isSuccess 
=   true ;

            
return  isSuccess;
        }

        
///   <summary>
        
///  重命名文件(用来检查文件是否生成完成)
        
///   </summary>
        
///   <param name="sourePath"> 源地址 </param>
        
///   <param name="targetPath"> 目标地址 </param>
        
///   <returns></returns>
         private   static   bool  RenameFile( string  sourePath,  string  targetPath)
        {
            
bool  isOpen  =   false ;
            
            
// 如果是相同地址,直接移动检查是否文件已经生成,否则进行复制(因为目标文件存在的话会有问题)
             if  (sourePath.Equals(targetPath))
            {
                
try
                {
                    
// 移动文件
                    File.Move(sourePath, targetPath);
                    isOpen 
=   true ;
                }
                
catch  (Exception e)
                {

                }
            }
            
else
            {
                
bool  isCopySuccess  =   false ;
                
try
                {
                    
// 复制文件
                    File.Copy(sourePath, targetPath,  true );
                    isCopySuccess 
=   true ;
                }
                
catch  (Exception e)
                {
                    isCopySuccess 
=   false ;
                }
                
if  (isCopySuccess)
                {
                    
// 如果复制成功,删除源文件
                    File.Delete(sourePath);
                }
            }

            
return  isOpen;
        }

 

 4、杀掉进行函数

ExpandedBlockStart.gif 代码
         ///   <summary>
        
///  根据进程名称来关闭进程
        
///   </summary>
        
///   <param name="processName"></param>
         private   static   void  KillPrecess( string  processName)
        {
            
foreach  (Process p  in  Process.GetProcesses())
            {
                
if  (p.ProcessName  ==  processName)
                {
                    p.Kill();
                }
            } 
        }

 


文档转pdf
  我们介绍的文档转化为pdf的方法,要求是较为通用,即不需要根据具体文档写具体的程序,且不仅要支持Office文档,最好还要支持txt、html等其他文档。

1、使用pdfFactory(见源码方法:ParsePDFWithPdfFactory)
说明:软件需要注册才能使用
原理:
  a. 调用系统默认打印机(pdfFactory)打印文档;
  b. 从打印机的临时目录里将pdf拷贝到目标路径;
pdfFactory的设置:
  a. 打开打印机,设置“pdfFactory Pro”为默认打印机;
  b. 打开“pdfFactory Pro”的“打印机首选项”,在“Licensing”选项卡里注册打印机;
  c. 打开“pdfFactory Pro”的“打印机首选项”,结合程序,进行如下两个图的设置;


 

优点:
  a. 只要支持打印的文件均可以用此法转化为pdf;
不足:
  a. 服务器上经常会弹出文件打印窗口;
  b. 一些损坏的文件或者格式不正确的文档会中止生成过程;
  c. 如果遇到带病毒宏的文档,会对服务器产生破坏;
注意事项:
  a. 打印过程中会产生大量临时文件在用户目录,需要及时清理垃圾文件,或者将对应目录迁移到磁盘空间较大的位置;
  b. Windows Server需要安装Server版pdfFactory;


2、使用FlashPaper(见源码方法:ParsePDFWithFlashPrinter)
原理:调用命令行“flashprinter c:\document.doc -o c:\document.pdf”进行打印;
优点:
  a. 只要支持打印的文件均可以用此法转化为pdf;
  b. 操作简单
不足:
  a. 由于程序本身问题,有时可能导致打印不能结束,几百个进程同时运行拖垮系统的情况;


3、其他方法(未附源码)
  使用其他虚拟打印机,例如:Virtual PDF Printer
  使用jcom或其它方式调用Office的Component进行转化,具体请参考: 将office文档(word,excel,powerpoint)转换为pdf
  调用使用JodConverter调用OpenOffice转化,具体请参考: JodConverter实现Office转化PDF格式


pdf转flash(见源码方法:ParseSWF)
原理:使用SWFTools的pdf2swf,调用命令行“pdf2swf.exe -T 9 -p 1-3 -s languagedir=D:\xpdf-3.02pl5\xpdf-chinese-simplified D:\document.pdf -o D:\document.swf”进行转换;

常见问题:
1、部分文档转化后乱码,控制台提示:找不到“Adobe-GB1”字体
解决办法:在pdf2swf命令中带上语言包,详情请看: http://cqfish.blog.51cto.com/622299/163566
2、部分文档可能无法在FlexPaper里无法显示
解决办法:flash版本的问题,在pdf2swf命令中带上参数,设置生成的版本为9(参数为:-T 9),这样兼容性最好。


pdf转图片(见源码方法:ParseCoverImage)
原理:使用“VeryPDF PDF To Image Converter”软件,调用命令行“pdf2img.exe -r 25 -f 1 -l 1 -i c:\1.pdf -o c:\11.jpg ”进行转换;


pdf转文本(见源码方法:ParseText)
有时为了生成摘要或者索引文档内容,需要将文档里的文本读取进来, xpdf是一个不错的工具。
原理:使用“ xpdf”软件,调用命令行“pdftotext.exe c:\1.pdf c:\1.txt”进行转化;
常见问题:要让xpdf支持中文,还需要下载中文语言包并做一些配置,xpdf中文化详细配置请参考: http://emily2ly.javaeye.com/blog/743552

本文涉及软件及源码下载: document-preview-online-demo-canbeing.rar

  

反馈文章质量,你可以通过快速通道评论:

 

转载于:https://www.cnblogs.com/flashlm/archive/2010/11/27/document-preview-online-file-convert.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值