2015-06-21 2 views
0

Я работаю над приложением Windows 8 Javascript, которое создает PDF-файл с использованием PDFKit.PDFkit js как сохранить документ в файл (приложение Win 8)

Обычно вы делаете 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 рассылает мне сообщения об ошибках во время выполнения Javascript о URI с неверной кодировкой.

Так что это, очевидно, проблема с кодировкой, и я не уверен, что делать дальше. Любые советы о том, как сохранить документ PDFkit в файл?

ответ

1

Я принял другой подход и узнал, что base64 - это путь. Таким образом, я не получил его просто для работы в Windows, но и на других платформах, таких как OSX.

Ключ должен был использовать blob-stream.js и объект FileReader для преобразования объекта Blob в URL-адрес данных (который в основном base64).

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

Для Windows вы затем конвертируете base64 в объект IBuffer и сохраняете его в файле. Ниже приведен пример, часть после того, как вар 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"); 
}); 
Смежные вопросы