【问题标题】:How to create a PDF file from any Base64 string?如何从任何 Base64 字符串创建 PDF 文件?
【发布时间】:2022-11-22 10:37:13
【问题描述】:

我想输入任何 Base64 字符串来运行并从那里获取 PDF。所以尝试了这种方式,它下载了PDF但是有一个错误

“无法加载 PDF 文档。”

这是我尝试过的方式

let data = "SGVsbG8gd29ybGQ=" //hello world

 var bufferArray = this.base64ToArrayBuffer(data);


    var binary_string = window.atob(data)
    var len = bufferArray.length;
    var bytes = new Uint8Array(len);

    for (var i = 0; i < len; i++) {
        bytes[i] = binary_string.charCodeAt(i);
    }

    let blob = new Blob([bytes.buffer], { type: 'application/pdf' })
  
    var url = URL.createObjectURL(blob);
  
    window.open(url);


 //convert base64 string to arraybuffer
 base64ToArrayBuffer(data) {
    var bString = window.atob(data);
    var bLength = bString.length;
    var bytes = new Uint8Array(bLength);
    for (var i = 0; i < bLength; i++) {
        var ascii = bString.charCodeAt(i);
        bytes[i] = ascii;
    }
    return bytes;
};

【问题讨论】:

  • 什么是this.base64ToArrayBuffer
  • 抱歉 - 我已经编辑了问题@CryptoAlgorithm
  • 我倾向于认为你在最终创建 Blob 之前所做的两个转换阶段有问题
  • @ericmp - 我试过它不起作用 (jsfiddle.net/Janaka_Ravindra/5fc8poy9/1)
  • @CryptoAlgorithm 你知道在创建 blob 之前发生了什么错误吗

标签: javascript


【解决方案1】:

Base64 不是 pdf,所以 hello.b64 永远不会变成 hello.pdf

它需要一个 pdf 标题页和十进制字节的尾部,这些不能轻易添加为包装太多变量的 base64 对象。

text/pdf 需要小心的脚本作为文本来环绕 hello 文本,请参见 hello example https://stackoverflow.com/a/70748286/10802527

以 Base64 为例JVBERi0xLjIgDQo5IDAgb2JqDQo8PA0KPj4NCnN0cmVhbQ0KQlQvIDMyIFRmKCAgSGVsbG8gV29ybGQgICAPJyBFVA0KZW5kc3RyZWFtDQplbmRvYmoNCjQgMCBvYmoNCjw8DQovVHlwZSAvUGFnZQ0KL1BhcmVudCA1IDAgUg0KL0NvbnRlbnRzIDkgMCBSDQo+Pg0KZW5kb2JqDQo1IDAgb2JqDQo8PA0KL0tpZHMgWzQgMCBSIF0NCi9Db3VudCAxDQovVHlwZSAvUGFnZXMNCi9NZWRpYUJveCBbIDAgMCAyNTAgNTAgXQ0KPj4NCmVuZG9iag0KMyAwIG9iag0KPDwNCi9QYWdlcyA1IDAgUg0KL1R5cGUgL0NhdGFsb2cNCj4+DQplbmRvYmoNCnRyYWlsZXINCjw8DQovUm9vdCAzIDAgUg0KPj4NCiUlRU9G

&lt;iframe type="application/pdf" width="95%" height=150 src="data:application/pdf;base64,JVBERi0xLjIgDQo5IDAgb2JqDQo8PA0KPj4NCnN0cmVhbQ0KQlQvIDMyIFRmKCAgSGVsbG8gV29ybGQgICApJyBFVA0KZW5kc3RyZWFtDQplbmRvYmoNCjQgMCBvYmoNCjw8DQovVHlwZSAvUGFnZQ0KL1BhcmVudCA1IDAgUg0KL0NvbnRlbnRzIDkgMCBSDQo+Pg0KZW5kb2JqDQo1IDAgb2JqDQo8PA0KL0tpZHMgWzQgMCBSIF0NCi9Db3VudCAxDQovVHlwZSAvUGFnZXMNCi9NZWRpYUJveCBbIDAgMCAyNTAgNTAgXQ0KPj4NCmVuZG9iag0KMyAwIG9iag0KPDwNCi9QYWdlcyA1IDAgUg0KL1R5cGUgL0NhdGFsb2cNCj4+DQplbmRvYmoNCnRyYWlsZXINCjw8DQovUm9vdCAzIDAgUg0KPj4NCiUlRU9G"&gt;frame&lt;/iframe&gt;

尝试上面的方法,但可能会被安全阻止它对某些用户来说看起来像这样,但不是全部!

在 cmets 中,您询问了如何在 java 脚本中操作文本,而我的标准答案是 java 脚本通常不能轻松地用于构建 PDF 或编辑 Base64 内容。但是,如果您已经准备好占位符,则可以通过查找和替换来更改它。但必须小心,因为总文件长度永远不应更改。

举个例子,把上面的作为先验模板,把内容切换到。

JVBERi0xLjIgDQo5IDAgb2JqDQo8PA0KPj4NCnN0cmVhbQ0KQlQvIDMyIFRmKCAg**RmFpci10aGVlLXdlbGwp**JyBFVA0KZW5kc3RyZWFtDQplbmRvYmoNCjQgMCBvYmoNCjw8DQovVHlwZSAvUGFnZQ0KL1BhcmVudCA1IDAgUg0KL0NvbnRlbnRzIDkgMCBSDQo+Pg0KZW5kb2JqDQo1IDAgb2JqDQo8PA0KL0tpZHMgWzQgMCBSIF0NCi9Db3VudCAxDQovVHlwZSAvUGFnZXMNCi9NZWRpYUJveCBbIDAgMCAyNTAgNTAgXQ0KPj4NCmVuZG9iag0KMyAwIG9iag0KPDwNCi9QYWdlcyA1IDAgUg0KL1R5cGUgL0NhdGFsb2cNCj4+DQplbmRvYmoNCnRyYWlsZXINCjw8DQovUm9vdCAzIDAgUg0KPj4NCiUlRU9G

因此,通过查找 SGVsbG8gV29ybGQgICAp 并将其替换为 RmFpci10aGVlLXdlbGwp,我们得到了文本更改:-(重要的是字符串长度是 4 的倍数并且长度相同)

&lt;iframe type="application/pdf" width="95%" height=150 src="data:application/pdf;base64,JVBERi0xLjIgDQo5IDAgb2JqDQo8PA0KPj4NCnN0cmVhbQ0KQlQvIDMyIFRmKCAgRmFpci10aGVlLXdlbGwpJyBFVA0KZW5kc3RyZWFtDQplbmRvYmoNCjQgMCBvYmoNCjw8DQovVHlwZSAvUGFnZQ0KL1BhcmVudCA1IDAgUg0KL0NvbnRlbnRzIDkgMCBSDQo+Pg0KZW5kb2JqDQo1IDAgb2JqDQo8PA0KL0tpZHMgWzQgMCBSIF0NCi9Db3VudCAxDQovVHlwZSAvUGFnZXMNCi9NZWRpYUJveCBbIDAgMCAyNTAgNTAgXQ0KPj4NCmVuZG9iag0KMyAwIG9iag0KPDwNCi9QYWdlcyA1IDAgUg0KL1R5cGUgL0NhdGFsb2cNCj4+DQplbmRvYmoNCnRyYWlsZXINCjw8DQovUm9vdCAzIDAgUg0KPj4NCiUlRU9G"&gt;frame&lt;/iframe&gt;

【讨论】:

  • 我的问题是有任何方法可以使用 javascript 创建此 PDF base64 字符串
  • 一个有效的 PDF 需要很多行李才能在页面中保存一串文本,有很多方法可以构建一个有效的简单 pdf,但是对于二进制的字体和图像(加上将对象排序到 pdf 树中所需的计算)然后需要二进制应用程序/pdf,因此仅使用文本构建 pdf 并不容易(可能但劳动强度很大)因此您需要一个 pdf 库,该库可以处理 pdf 对象及其在固定页面容器中的位置.pdf 如果您有一个预建的 pdf 模板,可以找到并用相同长度的文本替换 base64 部分,但同样很难!
猜你喜欢
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2015-04-18
  • 2018-07-10
相关资源
最近更新 更多