使用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




