2015-06-21 104 views
0

我正在使用PDFKit生成PDF的Windows 8 Javascript應用程序。PDFkit js如何將文檔保存到文件(Win 8應用程序)

通常情況下,你會使用pipe創建一個blobstream,然後創建一個你發送給瀏覽器的URL。這隻適用於從服務器運行網站的情況,由於它是本地應用程序,情況並非如此。不過,我可以訪問文件系統,並且希望將生成的PDF保存到文件中。

要做到這一點,我被這個問題啓發: How to pipe a stream using pdfkit with node js

我嘗試使用Browserify兩個以上的解決方案,替換用的代碼打印機代碼,保存到一個文件:

Windows.Storage.ApplicationData.current.localFolder.createFileAsync("test.pdf", 
    Windows.Storage.CreationCollisionOption.replaceExisting).then(function (file) { 
     //write as text 
     Windows.Storage.FileIO.writeTextAsync(file, data).then(function() {}); 
     //or write as buffer 
     var buffUTF8 = Windows.Security.Cryptography.CryptographicBuffer.convertStringToBinary(data, 0); 
     Windows.Storage.FileIO.writeBufferAsync(file, buffUTF8).then(function() {}); 
    }); 

,你可以看到我都嘗試使用書寫作爲文本或寫作緩衝區,都給了我完全相同的文件。

PDF文件已創建,但是當我打開它時,它會顯示一個空白頁。如果我在文本編輯器中打開pdf並將其與一個有效的PDF進行比較,我可以看出文件的流部分具有不同類型的字符。

而且在Visual Studio輸出窗口濫發我大約有無效編碼的URI的Javascript運行時錯誤消息。

所以這顯然是一個編碼的問題,我不知道下一步該怎麼做。有關如何將PDFkit文檔保存到文件的任何提示?

回答

1

我採取了不同的方法,發現base64是要走的路。這種方式我沒有得到它只是在Windows中工作,但也在OSX等其他平臺上。

的關鍵是使用斑點-stream.js和的FileReader對象到Blob對象轉換爲一個數據的URL(其基本上是BASE64)。

<script src="/pdfkit.js"></script> 
<script src="/blob-stream.js"></script> 

對於Windows你再以base64轉換爲IBuffer對象,並保存到文件中。下面給出了一個例子,VAR的base64之後的部分是特定於Windows,但它在其他平臺上的工作原理類似:

var doc = new PDFDocument({ size: 'A4', layout: 'portrait' }); 
stream = doc.pipe(blobStream()); 

stream.on('finish', function() { 
    fileReader = new FileReader(); 

    fileReader.onload = function() { 
     //get base64 part of the data url 
     var base64 = fileReader.result.substr(fileReader.result.indexOf(',') + 1); 
     //create file, create IBuffer, save and launch pdf reader 
     Windows.Storage.ApplicationData.current.temporaryFolder.createFileAsync("test.pdf", Windows.Storage.CreationCollisionOption.generateUniqueName).then(function (file) { 
      var buffUTF8 = Windows.Security.Cryptography.CryptographicBuffer.decodeFromBase64String(base64); 
      Windows.Storage.FileIO.writeBufferAsync(file, buffUTF8).then(function() { 
       Windows.System.Launcher.launchFileAsync(file); 
      }); 
     }); 
    }; 
    fileReader.onerror = function() { 
     console.log('error loading file'); 
    }; 

    fileReader.readAsDataURL(stream.toBlob('application/pdf')); 
}); 

//draw PDF content here 
doc.text('Hello World!', 100, 100); 
doc.end(); 
+0

Windows.Security.Cryptography.CryptographicBuffer.decodeFromBase64String(base64)幫助我移出IE Mobile atob()替代方案。 – tvelop

0

這是爲我工作在Firefox

_downloadAsPdf: (data) => 

doc = new PDFDocument() 
imgData = @renderer.canvas.toDataURL('image/png') 
stream = doc.pipe(blobStream()) 
doc.image(imgData) 
doc.end() 

stream.on 'finish', -> 

    blob = stream.toBlob('application/pdf') 

    # save as file 
    date = new Date() 
    time = date.toLocaleTimeString() 
    pageNum = data.pageNumber 
    fileName = "page" + pageNum + "_" + time + ".pdf" 
    saveAs(blob, fileName) 
0

一個跨瀏覽器的解決方案,工程對我來說:設置數據-URL您從PDF爲源動力的一個臨時鏈接元素生成:

function data_url_to_download(data_url, filename) { 
    var a = document.createElement("a"); 
    document.body.appendChild(a); 
    a.style = "display: none;"; 
    a.href = data_url; 
    a.download = filename; 
    a.click(); 
    a.remove(); 
}; 

該文件可以生成PDF完成後,再進行自動下載:

// Generate document to a stream with PDFKit, then... 
stream.on("finish", function() { 
    data_url_to_download(stream.toBlobURL("application/pdf"), "output.pdf"); 
}); 
相關問題