[转载]FlexPaper+SwfTools实现的在线文档功能

[转载]FlexPaper+SwfTools实现的在线文档功能 – penbox – 博客园.

最近一个项目需要实现一个在线浏览文档的功能。准备使用FlexPaper配合Pdf2Swf实现。

主要需求在于:

➔ 文档页数很多,少则几百页,多则上千页。
➔ 相应的文档大小也在50MB以上。

根据需求,将该功能拆分成了三部分:

上传:支持大文件,断点续传。
文件转换服务:在后台进行Pdf转Swf。
在线浏览:分页加载。

其中文件上传部分是我同事实现的,这里主要讲下后台服务和在线浏览部分。

文件转换服务

大体思路是:
后台服务定时扫描文件夹PdfPath,如果发现Pdf文件,则调用Pdf2Swf.exe,将PDF逐页转换成Swf文件,存入SwfPath中的与文件名称对应的文件夹里。

这里使用了SwfTools套件中的Pdf2Swf工具:下载

主要代码:

<span class="com">//PDF转换成SWF</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">ConvertPDFtoSWF</span><span class="pun">(</span><span class="kwd">string</span><span class="pln"> pdfFile</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Process</span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Process</span><span class="pun">())</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="typ">SystemLog</span><span class="pun">.</span><span class="typ">CurrentLogger</span><span class="pun">.</span><span class="typ">Debug</span><span class="pun">(</span><span class="kwd">string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"正在处理 {0} ..."</span><span class="pun">,</span><span class="pln"> pdfFile</span><span class="pun">));</span><span class="pln">
 
</span><span class="kwd">string</span><span class="pln"> pdf2swfExe </span><span class="pun">=</span><span class="pln"> </span><span class="str">"pdf2swf.exe"</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">string</span><span class="pln"> savePath </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GetSavePathFromName</span><span class="pun">(</span><span class="pln">pdfFile</span><span class="pun">);</span><span class="pln">
 
</span><span class="kwd">string</span><span class="pln"> cmd </span><span class="pun">=</span><span class="pln"> pdf2swfExe</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">string</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> </span><span class="str">"  -t \""</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> pdfFile </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\"  -o \""</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> savePath </span><span class="pun">+</span><span class="pln"> pdfFile</span><span class="pun">.</span><span class="typ">Split</span><span class="pun">(</span><span class="str">'\\'</span><span class="pun">).</span><span class="typ">Last</span><span class="pun">().</span><span class="typ">Replace</span><span class="pun">(</span><span class="str">".pdf"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">)</span><span class="pln">
</span><span class="pun">+</span><span class="pln"> </span><span class="str">"%.swf\" -s drawonlyshapes -s flashversion=9"</span><span class="pun">;</span><span class="pln">
 
p</span><span class="pun">.</span><span class="typ">StartInfo</span><span class="pun">.</span><span class="typ">FileName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> cmd</span><span class="pun">;</span><span class="pln">
p</span><span class="pun">.</span><span class="typ">StartInfo</span><span class="pun">.</span><span class="typ">Arguments</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> args</span><span class="pun">;</span><span class="pln">
p</span><span class="pun">.</span><span class="typ">StartInfo</span><span class="pun">.</span><span class="typ">UseShellExecute</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
 
</span><span class="com">//此类提供的标准output流只有2k,不要重定向</span><span class="pln">
p</span><span class="pun">.</span><span class="typ">StartInfo</span><span class="pun">.</span><span class="typ">RedirectStandardOutput</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
 
p</span><span class="pun">.</span><span class="typ">StartInfo</span><span class="pun">.</span><span class="typ">CreateNoWindow</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
p</span><span class="pun">.</span><span class="typ">Start</span><span class="pun">();</span><span class="pln">
p</span><span class="pun">.</span><span class="typ">PriorityClass</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ProcessPriorityClass</span><span class="pun">.</span><span class="typ">High</span><span class="pun">;</span><span class="pln">
p</span><span class="pun">.</span><span class="typ">WaitForExit</span><span class="pun">();</span><span class="pln">
 
</span><span class="typ">SystemLog</span><span class="pun">.</span><span class="typ">CurrentLogger</span><span class="pun">.</span><span class="typ">Debug</span><span class="pun">(</span><span class="kwd">string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} 处理完成。"</span><span class="pun">,</span><span class="pln"> pdfFile</span><span class="pun">));</span><span class="pln">
 
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">AppConfiguration</span><span class="pun">.</span><span class="typ">DeleteConvertedPdf</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="com">//转换完成后删除Pdf</span><span class="pln">
</span><span class="typ">File</span><span class="pun">.</span><span class="typ">Delete</span><span class="pun">(</span><span class="pln">pdfFile</span><span class="pun">);</span><span class="pln">
</span><span class="typ">SystemLog</span><span class="pun">.</span><span class="typ">CurrentLogger</span><span class="pun">.</span><span class="typ">Debug</span><span class="pun">(</span><span class="kwd">string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} 已删除。"</span><span class="pun">,</span><span class="pln"> pdfFile</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="com">//重命名Pdf</span><span class="pln">
</span><span class="typ">File</span><span class="pun">.</span><span class="typ">Move</span><span class="pun">(</span><span class="pln">pdfFile</span><span class="pun">,</span><span class="pln"> pdfFile </span><span class="pun">+</span><span class="pln"> </span><span class="str">".bak"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">SystemLog</span><span class="pun">.</span><span class="typ">CurrentLogger</span><span class="pun">.</span><span class="typ">Debug</span><span class="pun">(</span><span class="kwd">string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} 已重命名。"</span><span class="pun">,</span><span class="pln"> pdfFile</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span>
gentleface.com free icon set 写服务的时候遇到一个奇怪的Bug,发布为服务的时候,测试用的Pdf文件每次转换到37页的时候就卡住了,但是用命令行进行调试的时候却一切OK。
Google后发现,原来是Process的output流问题:output流只有2KB,而Pdf2Swf会产生大量输出,2KB很快就耗尽了。

之前在测试的时候,发现转换过程中会出现文字丢失的现象。这里使用了-s drawonlyshapes 这个参数,将Pdf全部作为图片转换的。这样虽然保证了兼容性,但是牺牲了空间。作为图片生成的Swf比文本格式的Swf要大不少,不知道大家有没有什么 好的解决方法。

在线浏览

FlexPaper支持分页加载,采用{filename[*,padding],total pages}这种语法即可。

主要代码:

<span class="tag"><a</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"viewerPlaceHolder"</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="pln">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">800px</span><span class="pun">;</span><span class="pln"> height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">600px</span><span class="pun">;</span><span class="pln"> display</span><span class="pun">:</span><span class="pln"> block</span><span class="pun">;</span><span class="atv">"</span><span class="tag">></a></span><span class="pln">
 
</span><span class="tag"><script</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/javascript"</span><span class="tag">></span><span class="com">// <!&#91;CDATA&#91;</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> fp </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">FlexPaperViewer</span><span class="pun">(</span><span class="pln">
    </span><span class="str">'FlexPaperViewer'</span><span class="pun">,</span><span class="pln">
     </span><span class="str">'viewerPlaceHolder'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> config</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
         </span><span class="typ">SwfFile</span><span class="pun">:</span><span class="pln"> </span><span class="str">'SwfFolder/<%=Folder %>/{<%=Folder %>&#91;*,0&#93;.swf,<%=PageNum %>}'</span><span class="pun">,</span><span class="pln">
         localeChain</span><span class="pun">:</span><span class="pln"> </span><span class="str">"zh_CN"</span><span class="pun">,</span><span class="pln"> </span><span class="com">//中文</span><span class="pln">
         </span><span class="typ">Scale</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">ZoomTransition</span><span class="pun">:</span><span class="pln"> </span><span class="str">'easeOut'</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">ZoomTime</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">ZoomInterval</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.2</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">FitPageOnLoad</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">FitWidthOnLoad</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">PrintEnabled</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">FullScreenAsMaxWindow</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">ProgressiveLoading</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">MinZoomSize</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.2</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">MaxZoomSize</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">SearchMatchAll</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">InitViewMode</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Portrait'</span><span class="pun">,</span><span class="pln">
 
         </span><span class="typ">ViewModeToolsVisible</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">ZoomToolsVisible</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">NavToolsVisible</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">CursorToolsVisible</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
         </span><span class="typ">SearchToolsVisible</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
     </span><span class="pun">});</span><span class="pln">
</span><span class="com">// &#93;&#93;></span><span class="tag"></script></span>
warning FlexPaper无法载入中文文件名。如果右上角的圈圈一直在转,注意是不是文件名称的问题。

参考文章

c# System.Diagnostics.Process 调用外部程序时WaitForExit锁死问题分析及解决方案

FlexPaper+SWFTools 实现仿百度文库及一些小问题

Pdf2Swf命令行参数

解决FlexPaper分页分段加载问题

源码

分页加载:FlexPaper.zip

文件转换服务:PDFtoSWFService.zip

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册