快速业务通道

根据批量URL生成有书签的PDF文档的解决方案 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

根据批量URL生成有书签的PDF文档的解决方案

时间:2011-05-20 BlogJava summeryhrb

一、缘起

看到一篇好文章、一篇精彩的博文,我们最早期的做法有两种,添加到收藏夹 ,或者另存为,后来出现了新的方式,转贴到自己的博客里、或者收藏到一些收 藏网站上(比如360doc)。近来又出现了生成PDF文档的方式,比如某些网站,你 提交一个url,就为你生成对应的pdf,javaeye的电子书制作也很不错,甚至可以 预测一下,浏览器的“另存为”窗口里有可能会有一个*.pdf选项。因为pdf实在 是太好了,小巧而有表现力丰富。尽管如此,如果有多篇好的文章呢,比如一个 非常优秀的连载(比如牛人写的教程、开发心得),我们能做的也就是添加到收 藏夹或添加到自己博客的链接里头。想当年,没钱买书的时候,就在网上找一些 教程来看,做得比较好的会有一个页面列出该连载的所有连接,这种情况我通常 用迅雷以下载全部链接的方式(再去掉不相关的链接)批量下载下来,做的简单 的只提供一个类似于上一篇下一篇的链接,这种情形到现在还是这样。(易用性 啊,这个问题可大可小,往大的说,关系到应用模式和商业模式,往小的说也许 就是个美观和方便。Javaei提供的快捷阅读采取左边树形菜单展示目录,右边展 示内容的形式,这种形式在界面的设计上屡试不爽。)

本文就是要阐述一种根据批量URL生成有书签的PDF文档的解决方案,这个批量 URL就是一些好的文章的URL,根据这些URL生成一个合并的PDF文档,并且要有书 签(也就是左边的树形菜单),而且必须要有书签。《java与模式》这本书想必 很多人都看过,老厚的一本书啊,我没钱买,看的是一个下载的pdf,这个pdf给 我的印象太坏了,没有书签,要找个东西只能拉滚动条,尽管如此,我还是看完 了,书写的不错,制作pdf的那个人功过相抵。

二、思路

目的是要根据批量URL生成有书签的PDF文档,实现这个目的分两步走:先解决 根据一个URL生成一个PDF文档,再解决多个PDF合并并生成书签的问题。

(1)根据一个URL生成一个PDF文档

根据一个URL生成一个PDF文档看似很容易,因为我们有iText,pdfbox这些开源 框架,实则不简单,因为要保证生成的pdf文档打开后的效果要和浏览器里的要一 样,这无异于做一个浏览器,目前的浏览器尚且存在兼容的问题,所以自己写一 个根据html生成pdf的想法很难实现。那么另一个思路就是利用一些网站来实现这 个目的,经过尝试,有些网站是需要提供URL和email,人家把生成好的pdf发到你 邮箱,这种形式无法通过代码来访问,也就无法批量处理;有些网站只需提交url ,就把生成的pdf响应给客户端,这种形式可以通过程序来批量处理,但是生成的 pdf与浏览器里的效果相差太远;还有一些网站根本就不支持中文。通过探索,终 于找到一个网站提供的C#做的dll可以达到这个要求,利用这个dll,写个简单的 C#程序就可以批量的生成pdf了,而且效果相当完美,美中不足的是生成的pdf里 有人家的水印。

(2)多个PDF合并并生成书签

多个PDF合并并生成书签可以轻松的用iText搞定,合并是有一定的顺序的,并 且书签是树形结构的,因此合并的顺序,书签的层次结构是需要事先确定好的。 所以对批量的URL要进行一定的描述,那么很自然的选择xml。

三、实现

我现在越来越觉得,只要不是基础设施的东西,技术上都很简单,关键是你有 没有想法。这个实现先从xml描述开始。

Xml描述分两步,先简单的描述一批URL(这里叫做href.h2p.xml),再来描述 层次关系(这里叫做outline.h2p.xml)。h2p就是html to pdf的意思

先看href.h2p.xml

<href-info>           <href id="KxgYaRxG">                     <value><![CDATA[http;//www.163.com]]></value>           </href>           <href id="53Bw5A32">                     <value><![CDATA[http://www.sohu.com]]></value>           </href>           <href id="eyEis6ra">                     <value><![CDATA[http;//news.163.com]]></value>           </href>           <href id="DMQoSN2t">                     <value><![CDATA[http;//sports.163.com]] ></value>           </href>           <href id="5vaf3LN7">                     <value><![CDATA[http://news.sohu.com]]></value>           </href> </href-info>

这个xml很简单,之所以这样描述,是因为URL通常会有&而这个符号不能 出现在xml里,而且作为属性的值,还不能用<![CDATA[]]>,所以就作为一 个节点了。

根据这个xml生成的每个pdf文件的名字取id的值,后缀为pdf。

outline.h2p.xml内容如下:

<book name="我的PDF书">           <chapter name="163" href="KxgYaRxG">                     <chapter name="163新闻" href="eyEis6ra" />                     <chapter name="163体育" href="DMQoSN2t" />           </chapter>           <chapter name="sohu" href="53Bw5A32">                     <chapter name="sohu新闻" href="5vaf3LN7" />           </chapter> </book>

这个xml描述了每个pdf合并的顺序,href的值和上一个xml的id值对应, chapter标签嵌套的层次就是书签的层次,name的值就是书签的名称。iText根据 这个xml把每个pdf合并成一个pdf,并生成书签。

我把这两个xml文件称为h2p文件。

四、h2p文件

行文到这里,这个解决方案就算结束了,俗话说,巧妇难为无米之炊,首先我 们要有上面说的这两个xml文件,这两个xml文件如果靠手工编辑的话,少量的URL 还行,如果多了就不方便了。所以应该有一个工具来编辑h2p文件。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号