【发布时间】:2021-07-03 07:50:54
【问题描述】:
我正在使用 Azure 存储将一些 pdf 存储为 blob。我想使用 Node SDK for Azure Storage 中提供的 AppendBlob class 即时连接它们。我的问题是,即使合并的 pdf 大小正确,当我打开它时,它也只显示其中的最后一页,而不是我连接的所有页面。我在代码中犯了错误吗?如果您能深入了解这个问题,我将不胜感激。
我不想下载它们并将它们连接到代码中,因为在某些情况下,生成的 pdf 大小超过 2gb,节点无法处理。
let bundleUuid = uuidv4();
var connString = process.env.ST_ENV_01_APS_03_CONNECTION_STRING;
var appendBlobClient = new AppendBlobClient(connString, container, userId + "/bundles/" + bundleUuid + ".pdf");
await appendBlobClient.create();
context.log(userId + "/bundles/" + bundleUuid + ".pdf");
for (const basketDocumentUri of basketDocumentUris) {
context.log("Fetching: " + basketDocumentUri.document_uuid + "/" + (basketDocumentUri.page_index + 1) + ".pdf")
let bbc = await containerClient.getBlockBlobClient(basketDocumentUri.document_uuid
+ "/" + (basketDocumentUri.page_index + 1) + ".pdf");
let details = await bbc.getProperties();
let url = self.generateSasTokenPDF(basketDocumentUri.document_uuid + "/"
+ (basketDocumentUri.page_index + 1) + ".pdf", "r");
try {
let mbblk = 4194304
let offset = 0;
while(offset < details.contentLength){
let response = await appendBlobClient.appendBlockFromURL(url.uri,offset,mbblk);
context.log(response);
offset += mbblk;
context.log(offset);
}
} catch (error) {
context.log(error);
debugger;
}
}
callback(bundleUuid)
【问题讨论】:
-
我不确定这种方法是否可行。本质上,PDF 文件是具有预定义格式的二进制文件。在附加 blob 中,您只是将字节附加到现有 blob,这会使 PDF 文件的格式无效。
-
生成的 pdf 似乎是有效的,因为它可以正常打开,唯一的问题是它只保留了添加的最后一页。
-
如果您认为我的评论粗鲁,我很抱歉。我只想表达的是,我很惊讶您认为观看者显示的内容与预期不同。
-
关于手头的问题:正如@Gaurav 已经暗示的那样,多个 pdf 文件的连接不会导致包含所有页面的单个有效 pdf。相反,它作为 pdf 是无效的。但请注意,众所周知,pdf 查看器会尝试修复损坏的 pdf。因此,您的查看器试图修复您的文件,导致它只显示一页。
标签: node.js azure pdf azure-blob-storage