在XML文件中,我们有一个表示PDF文件的base64编码字符串,该字符串包含一些表表示,即与本例类似。当解码该PDF文档的base64字符串时(如下图所示),我们最终得到的PDF文档大小为66KB,可以在任何PDF查看器中正确打开。
尝试使用TypeScript中的Buffer
解码相同的base64编码字符串时(在VSCode扩展名内),即使用以下功能:
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);
我们最终得到了一个大小为109KB的PDF文件,以及一个无法使用PDF查看器打开的文档。
对于一个简单的PDF,比如这一个,使用base64编码的字符串表示,上面的代码可以工作,并且PDF可以在任何PDF查看器中读取。
我还尝试使用
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。“解码”表。pdf
示例的大小为109 kB。
我做错了什么?如何解码PDF文件,如表格。pdf示例获取可读的pdf文档,类似于记事本提供的功能?
大量借用了关于如何从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
指向与缓冲区相同的内部字节数组。在这种情况下,这并不重要,因为此代码不引用构造函数外部的
缓冲区
,而是在有人决定为缓冲区的输出创建新变量的情况下。从(缓冲区,'base64')
介绍 Base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。 使用 String a = "伦家是一个非常长的字符串"; //5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy String encode = Base64.en
new String(..)转字符串的时候是怎么知道 -28, -72, -83 为一组的呢? 是字符编码有什么规则吗?( 0x**---- ,(byte) ** 是负数的就是3个字节一组这样?)
我有一个只在Chrome中呈现的页面,带有一系列自定义字体: 浏览器完美地呈现了一切。然而,当我试图将此打印到PDF时,有两个问题: > 无论我做什么,我都无法生成嵌入字体的PDF。我尝试过Chrome的“保存到PDF”,它会生成Adobe Acrobat无法打开的PDF。各种PDF打印机(如Adobe的)不会产生嵌入这些字体的PDF,即使用标准的网络字体替换@font-faces确实会产生嵌入字
问题内容: 纯粹出于好奇,Base64图像嵌入在哪些浏览器中起作用?。 我意识到对于大多数事情来说,通常不是一个好的解决方案,因为它会增加页面的大小-我很好奇。 一些例子: HTML: CSS: 问题答案: 更新 现在,所有主要浏览器都支持数据URI。从版本8开始,IE也支持嵌入图像。 现在,以下Web浏览器支持数据URI: 基于壁虎,例如Firefox,SeaMonkey,XeroBank,Ca
所以我有下面的问题。我收到一个文件,其中包含一组字体。这些字体没有嵌入到文件中。下面是一个简单的例子: 我希望将这些字体嵌入到中,这样它们就可以自包含并且始终可用。但事情似乎没那么简单。我正在使用进行处理。 我已经阅读并尝试了以下问题/答案: null
问题内容: 我有一个使用Foxit表单设计器创建的pdf文件。在我的设计系统上,我安装了条形码字体。条形码字体在AcroField之一中使用。foxit似乎没有在文档中嵌入字体。 我也有一些客户的计算机上未安装条形码字体,因此我想将该字体嵌入到PDF中。我是否可以使用iText将AcroFields中使用的字体嵌入到PDF中? 编辑: 字体似乎包含在文本中,但没有包含在字段中,因此字体(条形码)将