问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何创建pdf的buffer,让pdf.js实现预览pdf文件

发布网友 发布时间:2022-04-20 17:06

我来回答

1个回答

热心网友 时间:2023-07-12 02:57

纯Java的解决方案:  我们首先想到的自然就是JDK1.4提供的JPS(JavaPrintingService)啦,不过,这东西虽然说支持PDF的Flavor,但是,不管是个人实验还是网上他人的评论,好像根本就是useless,可能如果说你的打印机Driver支持PDF的Flavor的话,JPS会检测到你的driver的这个特性,能够成功的打印PDF文档出来,但是,大部分情况下,这种情形是不成立的,故此JPS死路一条啦!  让我们看看PDF的老家Adobe那里有没有什么法宝,我们发现一个ViewerBean的组件,说是可以将PDF以Bean组件的方式潜入到Swing中,哇,太爽了,不过慢着,协议上说不提供任何支持,也不保证不出任何问题,管那么些,试过再说,一实验才知道,靠,Exception频发,而且这个组件较为陈旧,还是扔一边吧!  还有一个PDFBox,OpenSource的,不过对中文支持不好,而且好像开发进度也不是很好,没有发布一个正式的版本,基本上不能用于生产环境;  最后,求助于Commercial的产品吧,实验了一下ActiveTree的JPrint,感觉不错,完全可以胜任我们的需求而且恰到好处,不过授权费很贵,Email问过之后的答复是2000USD的最低购买,呵呵,虽然日本人很有钱,但也心疼这个银子啊,所以最终也得作罢!(ActiveTree的授权其实挺令我ft的,他其实在2003年的时候是可以免费使用的,但之后就变卦了,呵呵,当时记得我还给提过一些bug之类,算了,人家做出这个东西也不容易)  其他商业产品也是价格不菲,所以,基本上纯Java的solution到这里就否决了,让我们看Java-Com的解决方案吧!  Java-Com的解决方案:  在前一条路走不通之后,我痛定思痛,决定转向自己不熟悉的领域,ms的领地,我打算从Java中调用Com组件,由Com组件来帮助我们实现PDF的打印工作,不够这条路也不是一帆风顺那!  我们知道,AcrobatReader在发布的时候会随同发布一个支持浏览器的com组件用来manipulate他的这个PDF文档格式,所以,我们想要本地调用这个随同发布的Com组件来实现PDF打印。虽然Version5,6,7的这个组件格式不一样(5,6是以ocx的格式发布,7是以dll的格式发布),但是,不管那么些,先从7开始吧!  要调用com,那么我们需要一个从java到com的Bridge,所以,jacob第一个跃入我的脑海,因为之前就用过嘛!但是麻烦来了,我们并不知道这个com组件提供了那些调用接口啊!哎,没法,回学校求教熟悉.net的同学,给好不容易弄出几个需要的调用方法(哎,可怜我的周末啊),星期一就回来用jacob调用啦,可是左试右试就是一直抛异常,我那个气啊!难道是jacob的为问题?!我就又找了jcom和jcom2等类似的产品,但jcom全是日文文档,没有法,而jcom2估计也是一个德行(我忘了为什么当初否决了这个),所以就决定试一试商业产品吧!  这方面的商业产品主要有J-Integra,JPanel(好像叫这个名字)以及一个叫JNIWrapper的产品(这个是一个人用用来演示在java中使用Acrobat5打印PDF的时候提到的)。这些商业产品好的地方就是他可以根据某个你要调用的com组件为你自动生成相应的Proxy对象java代码,这样你就可以直接调用你熟悉的java代码了。像jacob等开源项目,如果给出一个类似的codegeneration工具的话,就完全不逊于这些商业产品啦。鉴于商业产品的价格,我最终还是否决了这些(日本人其实也听抠门的)。  这样,Java-com也对这个问题没辙了。  不过,最后在我的解决方案中,我还是使用了Jacob,这是后话,暂且不提    那我们考虑一下,如果PDF打印不行,打印其他格式行不行?!比如图片,这个JPS可以完全打印,所以,我们找一下有没有将PDF格式转换为其他格式的工具吧!  PDF格式转换的解决方案:  在这个领域,主要的就是有GhostScript/GView和ImageMagick,前者可以将PDF格式转换为PostScript格式,但是好像GhostScript也不能用JPS完全打印出来;而后者是一个将PDF转换为Image的API工具,他的Java实现叫JMagick,但他有一个跟GhostScript同样的问题,就是要转换,就必须在本地安装,然后通过命令行的方式调用,这个显然也不是很好,而且集成性很差,还是作罢!    剩下的一个是命令行调用啦,这是从itext网站找到的,你可以通过在命令行运行AcroRd32/p/h"pathtoPDFfile"这样的命令来打印你要打印的PDF文件,当然,你可以在PDF文件生成后就将他们依次放入一个批处理文件来执行这些打印命令,但是这个方案唯一的问题就是,每打印一个文件都会启动一个AcrobatReader窗口而且必须手动关闭,这现在不能满足目前的系统要求。  好了,所有的方案基本上都罗列完了,也没有找到一个可行的方案:-(  (没有银子嘛,不然Activetree的JPrint不错的说)    这些东西差不多郁闷了我3,4天吧,那几天简直就是boredtodeath.    不过,在郁闷的这几天的结尾,却有一道灵光闪过我的脑海  能不能说启动一个打印service,当文档要打印的时候,直接发送给它就行了那?!而恰好我发现一段在网页中加载PDF文档的Javascript代码,而且完全可以使用js来控制PDF的打印,所以,最终的这个方案就浮出水面了  1-使用jacob启动一个IE进程,并隐藏IE窗口;  if(ieAutomation==null)  ieAutomation=newActiveXComponent("InternetExplorer.Application");  ieAutomation.setProperty("Visible",newVariant(false));  2-PDF前端在生成PDF文件之后发送生成后的文件到JacobPDFPrinter,JacobPDFPrinter根据出入的PDF文件的全路径使用Velocity模板引擎动态生成一个包含使用Javascript代码实现的PDF打印逻辑的HTML文档(当然,使用Velocity生成文档这部分逻辑我们单独抽出到VeloIEPrinterGenerator类中);  3-在HTML生成之后,在JacobPDFPrinter中就可以使用jacob调用IE的Navigate2,将IE重定向到刚才生成的这个HTML文件啦,这样,IE就会在后台调用JS代码将PDF打印到默认打印机;  4-打印成功之后,清除临时动态生成的HTML文件;  5-当主程序退出之前,Quit后台IE进程。  以上就是我能给出的一个solution,并不完美,但itworks.  需要注意的几个问题是:  (1)需要设置IE的一个高级选项,运行本地脚本运行;  (2)因为Java和Com线程模型的不一致,导致在最终Quit后台IE进程的时候会抛出Com调用异常,因为对于Win平台API以及相关编程模型不是很熟悉,所以,这个问题需要求助于别人帮忙解决;  (3)IE在执行JS打印PDF的时候,同样会后台启动Acrobat的一个进程,而这个进程我们程序中无法控制其生命周期,所以,主程序退出后,我们没有法同时kill这个进程,好在不管我们运行多少次,这个进程在后台只有一个,所以,性能负担不是很大;转载
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 pdf.js使用问题 pdf.js 如何预览本地文件 如何使用pdf.js播放pdf文件 pdfjs如何加载字体库 我的ipadmini2国行版插卡的,为什么卡槽打不开?是需要什么工具吗? 苹果显示与亮度自动锁定怎么更改? iphone屏幕亮度自动锁定无法调节 如何开启苹果手机显示与亮度的自动锁定 苹果手机来信息后屏幕一直亮不熄灭,“显示与亮度“-... 苹果手机怎么让亮度不自动调节 苹果不锁屏设置方法 ipad卡槽打不开怎么办 ipad2 的卡槽弹不出了怎么办????? 优酷客户端kux格式转换工具怎么转换mp4视频呢 kux怎么转换MP4? KUX格式转换工具如何转换视频文件? 如何将视频KUX格式转换成MP4格式? 盒装鸭血怎麽做 盒装鸭血是生的还是熟的 鸭血放冷藏还是冷冻 pdf.js 无法在线预览PDF 使用Pdf.js做一个动态展现pdf文档的功能。 展现出... PDF.js 如何取到PDF的目录页码 前台js 如何使用pdf.js预览pdf文件流(base64) pdf.js可以实现lazyload吗? pdfjs怎么设置页面开始默认为只读模式 使用js下载保存pdf文件 pdf.js 文件加载缓慢 有什么方法可以解决嘛? 或者... pdf.js如何兼容ie8 php网站pdf显示插件 pdf.js 浏览器打开大文件崩溃。 前端用pdf.js插件应该怎么写代码 如何在java中用javascript来打印pdf 如何处理流必须以PDF JS有数据错误 pdf.js 可以放在tp框架中吗 网红奶瓶酸奶怎么打开 安慕希酸奶怎么打开盖子? 盒装酸奶怎么打开 初饮酸奶带奶嘴怎么使用 袋装酸奶怎么打开 晨光盒装酸奶怎么打开