我正在节点10.16环境中使用quickbooks api。我正在尝试通过API获取PDF。
我得到的是看起来正确的响应,但是当我打开它时显示为空白
我直接使用邮递员下载了一个文件,该文件有效。
我已经使用记事本++打开了两个文件,我可以看到文件上的某些字符有吗?或一个正方形,在邮递员文件上我看到一个字符。
This google folder has both files
这是主要代码,我使用fetch从API中获取信息
return fetch(url, fetchOptions).then((response) => {
if (response.ok) {
return response.text()
}
response.text()是发生错误解码的地方,因为我已将其直接保存到文件中,或者尝试使用TextDecoder对其进行解码,并且它始终会给我带来不良字符。
这是我到目前为止测试过的内容
return response.arrayBuffer().then(buffer => {
let decodedValue = new util.TextDecoder('utf-8').decode(buffer)
fs.writeFile('decodetest.pdf', decodedValue, (err) => {
// throws an error, you could also catch it here
if (err) throw err;
// success case, the file was saved
console.log('decode file saved!');
});
return decodedValue;
});
rp以下使用的是不同的程序包响应承诺。也给出相同的结果。
return rp(options)
.then(function (response) {
console.log("Did a new response");
response.body
fs.writeFile('requesttest.pdf', response.body, (err) => {
// throws an error, you could also catch it here
if (err) throw err;
// success case, the file was saved
console.log('request test file saved!');
});
})
.catch(function (err) {
// Delete failed...
});
我假设您要在浏览器中显示文件。我会为此使用3rd party库。这是直接来自Mozilla pdf.js文档的代码,对我来说显示来自Express服务器的.pdf文件效果很好。更改'url'变量以指向要渲染的pdf,我已经注释掉了,但是会附加一个gif,以显示它的渲染方式:
/ public / javascripts / main.js
// If absolute URL from the remote server is provided, configure the CORS
// header on that server.
var url = 'https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf';
// var url = '/test.pdf';
// Loaded via <script> tag, create shortcut to access PDF.js exports.
var pdfjsLib = window['pdfjs-dist/build/pdf'];
// The workerSrc property shall be specified.
pdfjsLib.GlobalWorkerOptions.workerSrc = '//mozilla.github.io/pdf.js/build/pdf.worker.js';
var pdfDoc = null,
pageNum = 1,
pageRendering = false,
pageNumPending = null,
scale = 0.8,
canvas = document.getElementById('the-canvas'),
ctx = canvas.getContext('2d');
/**
* Get page info from document, resize canvas accordingly, and render page.
* @param num Page number.
*/
function renderPage(num) {
pageRendering = true;
// Using promise to fetch the page
pdfDoc.getPage(num).then(function(page) {
var viewport = page.getViewport({scale: scale});
canvas.height = viewport.height;
canvas.width = viewport.width;
// Render PDF page into canvas context
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
var renderTask = page.render(renderContext);
// Wait for rendering to finish
renderTask.promise.then(function() {
pageRendering = false;
if (pageNumPending !== null) {
// New page rendering is pending
renderPage(pageNumPending);
pageNumPending = null;
}
});
});
// Update page counters
document.getElementById('page_num').textContent = num;
}
/**
* If another page rendering in progress, waits until the rendering is
* finised. Otherwise, executes rendering immediately.
*/
function queueRenderPage(num) {
if (pageRendering) {
pageNumPending = num;
} else {
renderPage(num);
}
}
/**
* Displays previous page.
*/
function onPrevPage() {
if (pageNum <= 1) {
return;
}
pageNum--;
queueRenderPage(pageNum);
}
document.getElementById('prev').addEventListener('click', onPrevPage);
/**
* Displays next page.
*/
function onNextPage() {
if (pageNum >= pdfDoc.numPages) {
return;
}
pageNum++;
queueRenderPage(pageNum);
}
document.getElementById('next').addEventListener('click', onNextPage);
/**
* Asynchronously downloads PDF.
*/
pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
pdfDoc = pdfDoc_;
document.getElementById('page_count').textContent = pdfDoc.numPages;
// Initial/first page rendering
renderPage(pageNum);
});
/ views / index.ejs
<!DOCTYPE html>
<html>
<head>
<title>Express PDF Example</title>
</head>
<body>
<script src="//mozilla.github.io/pdf.js/build/pdf.js"></script>
<h1>PDF.js Previous/Next example</h1>
<div>
<button id="prev">Previous</button>
<button id="next">Next</button>
<span>Page: <span id="page_num"></span> / <span id="page_count"></span></span>
</div>
<canvas id="the-canvas"></canvas>
<script type="text/javascript" src="/javascripts/main.js"></script>
</body>
</html>