You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用Office JS API上传Word生成的PDF为何为空文档?

解决Word转PDF上传后出现空白文档的问题

我注意到你在用Office JavaScript API把Word文档转成PDF上传到服务器后,遇到了上传的PDF是空白的问题——原文档明明有3页,但服务器收到的PDF却是3页空白,而且你已经确认服务器本身没问题,之前上传其他PDF都正常。这问题其实出在二进制PDF数据的编码处理错误上,咱们来一步步修复:

问题根源

你的代码把二进制的PDF数据当成UTF-16字符串来处理(用String.fromCharCode转换字节),这会严重破坏原始的二进制信息。PDF是二进制文件,不是文本文件,很多字节无法用普通字符表示,强行转字符串再转回二进制就会导致数据损坏,最终生成的PDF自然是空白的。

修正后的完整代码

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);
        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) {
                return;
            }
            // 直接存储原始Uint8Array切片,不做字符串转换
            docdataSlices[sliceResult.value.index] = sliceResult.value.data;
            if (++slicesReceived == sliceCount) {
                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) {
    // 合并所有Uint8Array切片为完整的二进制数组
    const totalLength = docdataSlices.reduce((total, slice) => total + slice.length, 0);
    const docdata = new Uint8Array(totalLength);
    let offset = 0;
    for (const slice of docdataSlices) {
        docdata.set(slice, offset);
        offset += slice.length;
    }
    console.log('Final PDF content is received and stored in docdata.');
    send_file_content(docdata);
}

function send_file_content(pdfData) {
    var formData = new FormData();
    // 直接用Uint8Array创建Blob,保留完整二进制数据
    var blob = new Blob([pdfData], { 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);
    });
}

关键修改点

  • 移除了所有字符串转换逻辑:不再用String.fromCharCode处理二进制字节,直接保留Uint8Array类型的原始数据
  • Uint8Array合并切片:通过数组拼接的方式直接合并二进制数据,确保每一个字节都完整保留
  • 直接用二进制数组创建Blob:生成的Blob是标准的PDF二进制数据,服务器收到后能正常解析显示

修改后上传的PDF就会和Word转成的原始PDF内容一致,不会再出现空白页了。

内容的提问来源于stack exchange,提问作者Alireza

火山引擎 最新活动