[转载]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> |
![]() |
写服务的时候遇到一个奇怪的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" > // <![CDATA[</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 %>[*,0].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" > // ]]></span><span class="tag"></script></span> |
![]() |
FlexPaper无法载入中文文件名。如果右上角的圈圈一直在转,注意是不是文件名称的问题。 |
参考文章
c# System.Diagnostics.Process 调用外部程序时WaitForExit锁死问题分析及解决方案
FlexPaper+SWFTools 实现仿百度文库及一些小问题
源码
分页加载:FlexPaper.zip
文件转换服务:PDFtoSWFService.zip