2012-09-12 81 views
6

我想开发一个(离线)打包的应用程序与铬23 +允许用户生成和打印PDF文件。我尝试过不同的方式来实现这一点,但没有一个真正有效。Chrome打包的应用程序/ pdf.js

使用这样的事情,浏览器/应用程序冻结:

window.html (includes pdf.js (http://code.google.com/p/jspdf/) and genpdf.js (see below)): 

.... 
<browser src="about:blank" width="1024" height="768"></browser> 

genpdf.js: 

var doc = new jsPDF(); 
doc.text(20, 20, 'foo'); 
doc.text(20, 30, 'bar'); 
document.querySelector('browser').src = window.webkitURL.createObjectURL(new Blob([doc.output()], {type: 'application/pdf'})); 

这将是我的,以显示生成的PDF首选方式,但与窗口冻结用户不能打印。

另一种方式是将PDF保存到桌面上:

chrome.fileSystem.chooseFile({type: 'saveFile'}, function(writableFileEntry) { 
    writableFileEntry.createWriter(function(writer) { 
     writer.onerror = function(e) { 
     console.log('writeend'); 
     }; 
     writer.onwriteend = function(e) { 
     console.log('writeend'); 
     }; 
     var doc = new jsPDF(); 
     doc.text(20, 20, 'foo'); 
     doc.text(20, 30, 'bar'); 
     writer.write(new Blob([doc.output()], {type: 'application/pdf'})); 
    }, errorHandler); 
}); 

这工作,但桌面上的文件被锁定,直到应用程序被关闭。是否有任何api-call我缺少释放保存的文件?

在此先感谢!

+0

很想看到有人回答这个问题。 – knownasilya

+1

如果您的首选解决方案导致Chrome崩溃,我会做的第一件事是[提出问题](http://code.google.com/p/chromium/issues/list)。 Chrome开发者很可能会帮助你。 –

回答

3

在第二种解决方案中,我相信您应该提供缓冲区大小,以便作者能够知道写入何时结束。

var docBuffer = doc.output(); 
writer.write(new Blob([docBuffer], {type: 'application/pdf', 'size': docBuffer.length})); 
+0

我不会说你的答案解决了这个问题,但它确实让我们更接近于调试它。 – knownasilya

+0

是的,你说得对!如果操作提供了更多信息,我想帮助 – cvsguimaraes

-1

采取一个潜行峰wkhtmltopdf,它使用WebKit引擎从HTML + CSS页面生成PDF。我喜欢它,它产生的像素与Chromium浏览器中出现的页面相同。有MS-Windows和Linux的版本,我都试过。

+1

OP正在寻找一种浏览器内方法,特别是使用Chrome应用程序,而不是基于webkit的实用程序。 – knownasilya

+0

Knownasilya指出,这并不能解决所问的问题。 –

+0

有时,改变问题的努力花费比解决问题要少。我不熟悉*打包的应用*,但是如果他们可以启动外部可执行文件,也许这是一个更快的解决方案。另外,当从HTML生成PDF时,模板可以由网页设计师编辑,结果布局将更专业。 – ern0

相关问题