为什么使用API​​上传Word OfficeJS PDF文档会保存一个空的PDF文档

时间:2019-01-19 10:04:44

标签: javascript ajax ms-word upload office-js

为了将文档保存在Microsoft中,我使用了PDF提供的以下JS代码:

Office.context.document.getFileAsync(Office.FileType.Pdf,
        function(result) {
            if (result.status == "succeeded") {
                var myFile = result.value;
                var sliceCount = myFile.sliceCount;
                var slicesReceived = 0, gotAllSlices = true, docdataSlices = [];
                console.log("File size:" + myFile.size + " #Slices: " + sliceCount);
                // Now, you can call getSliceAsync to download the files,
                // as described in the previous code segment (compressed format).
                // Get the file slices.
                getSliceAsync(myFile, 0, sliceCount, gotAllSlices, docdataSlices, slicesReceived);
                myFile.closeAsync();
            }
            else {
                console.log("Error:", result.error.message);
            }
        }
    );

function getSliceAsync(file, nextSlice, sliceCount, gotAllSlices, docdataSlices, slicesReceived) {
    file.getSliceAsync(nextSlice, function (sliceResult) {
        if (sliceResult.status == "succeeded") {
            if (!gotAllSlices) { // Failed to get all slices, no need to continue.
                return;
            }

            // Got one slice, store it in a temporary array.
            // (Or you can do something else, such as
            // send it to a third-party server.)
            docdataSlices[sliceResult.value.index] = sliceResult.value.data;
            if (++slicesReceived == sliceCount) {
              // All slices have been received.
              file.closeAsync();
              onGotAllSlices(docdataSlices);
            }
            else {
                getSliceAsync(file, ++nextSlice, sliceCount, gotAllSlices, docdataSlices, slicesReceived);
            }
        }
            else {
                gotAllSlices = false;
                file.closeAsync();
                console.log("getSliceAsync Error:", sliceResult.error.message);
            }
    });
}

function onGotAllSlices(docdataSlices) {
    var docdata = [];
    for (var i = 0; i < docdataSlices.length; i++) {
        docdata = docdata.concat(docdataSlices[i]);
    }

    var fileContent = new String();
    for (var j = 0; j < docdata.length; j++) {
        fileContent += String.fromCharCode(docdata[j]);
    }

    console.log('Final PDF content is received and stored in fileContent.');


    send_file_content(fileContent);
}

function send_file_content(word_doc) {
    var formData = new FormData();
    var blob = new Blob([word_doc], { type: "application/pdf"});
    formData.append("file", blob);
    $.ajax({
        type: 'POST',
        url: 'My-upload-URL',
        data: formData,
        processData: false,
        contentType: false
    }).done(function(data) {
        console.log('* Word Document successfully uploaded: ', data.filepath);
    });
}

我非常确定服务器端可以正常运行,因为我已经上传了成千上万的PDF文档,并且可以按预期工作,但是当我通过上面的JS代码上传Word PDF Document时,我得到了空白页服务器端。如果Word文档包含3页,那么我将在服务器端获得3个空白页作为PDF文件。

1 个答案:

答案 0 :(得分:2)

Microsoft Documentation具有charCodeAt函数,该函数破坏数据并制作空白的PDF文档。

我没有使用该函数,而是直接在字节数组上使用了Uint8Array

var blob = new Blob([new Uint8Array(myFinalByteArray)], { type: 'application/pdf' });

然后使用BlobFormData上传到远程服务器。这种方法解决了问题。