[英]Base64 Decode embedded PDF in Typescript
在一個 XML 文件中,我們有一個代表 PDF 文件的 base64 編碼字符串,其中包含一些表格表示,即類似於這個例子。 在解碼該 PDF 文檔的 base64 字符串時(例如 this ),我們最終得到一個大小為 66 kB 的 PDF 文檔,該文檔可以在任何 PDF 查看器中正確打開。
在嘗試使用 TypeScript 中的Buffer
(在 VSCode 擴展中)解碼相同的 base64 編碼字符串時,即使用以下函數:
function decodeBase64(base64String: string): string {
const buf: Buffer = Buffer.from(base64String, "base64");
return buf.toString();
}
// the base64 encoded string is usually extracted from an XML file directly
// for testing purposes we load that base64 encoded string from a local file
const base64Enc: string = fs.readFileSync(".../base64Enc.txt", "ascii");
const base64Decoded: string = decodeBase64(base64Enc);
fs.writeFileSync(".../table.pdf", base64Decoded);
我們最終得到一個 109 kB 大小的 PDF 和一個無法使用 PDF 查看器打開的文檔。
對於像這樣的簡單 PDF,具有像這樣的 base64 編碼字符串表示,上面的代碼有效,並且可以在任何 PDF 查看器中閱讀 PDF。
我還嘗試使用以下命令直接讀取本地存儲的 PDF 文件的 base64 編碼表示
const buffer: string | Buffer = fs.readFileSync(".../base64Enc.txt", "base64");
雖然也沒有產生有用的東西。
即使稍微修改了這個建議,由於atob(...)
不存在( 建議用 Buffer 替換atob
),結果是這樣的代碼:
const buffer: string = fs.readFileSync(".../base64Enc.txt", "ascii");
// atob(...) is not present, other answers suggest to use Buffer for conversion
const binary: string = Buffer.from(buffer, 'base64').toString();
const arrayBuffer: ArrayBuffer = new ArrayBuffer(binary.length);
const uintArray: Uint8Array = new Uint8Array(arrayBuffer);
for (let i: number = 0; i < binary.length; i++) {
uintArray[i] = binary.charCodeAt(i);
}
const decoded: string = Buffer.from(uintArray.buffer).toString();
fs.writeFileSync(".../table.pdf", decoded);
我沒有得到一個可讀的 PDF。 “解碼”的table.pdf
樣本最終大小為 109 kB。
我在這里做錯了什么? 我怎樣才能解碼一個PDF,比如table.pdf 示例來獲得一個可讀的PDF 文檔,類似於Notepad++ 提供的功能?
從如何從 ArrayBuffer 獲取數組的答案中大量借用? , 如果您使用Uint8Array
構造函數從Buffer
獲得一個Uint8Array
:
const buffer: string = fs.readFileSync(".../base64Enc.txt", "ascii");
const uintArray: Uint8Array = new Uint8Array(Buffer.from(buffer, 'base64'));
fs.writeFileSync(".../table.pdf", uintArray);
將Uint8Array
直接寫入文件可確保不會因從字符串移動到字符串或從字符串移動而導致的編碼更改而造成損壞。
請注意:
Uint8Array
指向與Buffer
相同的內部字節數組。 在這種情況下並不重要,因為此代碼不引用構造函數外部的Buffer
,但以防有人決定為Buffer.from(buffer, 'base64')
的輸出創建一個新變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.