【问题标题】:Getting a base64 png from a PDF.JS pdf converted to a canvas tag?从转换为画布标签的 PDF.JS pdf 获取 base64 png?
【发布时间】:2017-03-04 07:10:32
【问题描述】:

我正在尝试从画布中获取 base64 编码的 png 值,该画布是通过使用 Mozilla 的 PDF.JS 库转换 pdf 而创建的。

所以我有一个 base64 编码的 PDF,我将它转换为 HTML 画布。我现在需要将该 HTML 画布转换为 base64 编码的 png 值,我可以将其与正确显示的 HTML img 标记一起使用。

我尝试了 HTMLCanvasElement.toDataURL(),但它没有显示任何内容。我尝试使用相同的方法在画布中绘制一些绿色框,并且效果很好,这意味着转换为画布的 base64 编码 pdf 不想使用该方法。

我尝试过的解决方案是否有任何其他解决方案或解决方法?

**我需要在我的 JS 代码中使用我的 HTML 执行此操作。

function convertDataURIToBinary() {
      var raw = window.atob(BASE64 OF PDF);
      var rawLength = raw.length;
      var array = new Uint8Array(new ArrayBuffer(rawLength));

      for(var i = 0; i < rawLength; i++) {
        array[i] = raw.charCodeAt(i);
      }
      return array;
    }
    var pdfAsArray = convertDataURIToBinary();

    PDFJS.workerSrc = "http://mozilla.github.io/pdf.js/build/pdf.worker.js";
    var canvas = _el.querySelector(".insertHere");
    PDFJS.getDocument(pdfAsArray).then(function getPdfHelloWorld(pdf) {
      pdf.getPage(1).then(function getPageHelloWorld(page) {
        var scale = 1.5;
        var viewport = page.getViewport(scale);


        var context = canvas.getContext("2d");
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        var renderContext = {
          canvasContext: context,
          viewport: viewport
        };
        page.render(renderContext);
        canvas = _el.querySelector(".insertHere");
        var imgSrc = canvas.toDataURL("image/png");
        var img = new Image();
        img.src = imgSrc;
        _el.querySelector(".insertImageLabel").appendChild(img);

      });
    });

【问题讨论】:

  • 不是一个完美的解决方案,但您可以截取画布的屏幕截图。
  • @UltrasoundJelly 感谢您的建议,但是我需要在我的代码中完成它。我应该澄清一下。
  • 你能提供一些示例代码吗?
  • "I had a base64 encoded PDF that I converted into a HTML canvas" - 你是怎么做到的?您不能只将 setImageData 与 base64 编码的 PDF 一起使用,就像您可以将 base64 编码的 mp3 扔到画布上并期望它的可视化一样......
  • @enhzflep, setImageData 在 Canvas2d API 和 pdf.js 库中都不存在,我猜你指的是 putImageData 它只适用于 ImageData 对象和 OP 从不在他的帖子中任何地方都提到过。然而,他说他使用pdf.js 库,它有一个render() 方法,需要一个画布上下文。但是,我们确实缺乏有关 pdf 及其内容的来源的信息,无法帮助 OP。

标签: javascript html pdf canvas pdf.js


【解决方案1】:

您不是在等待 render() 返回的承诺来完成异步操作。看https://github.com/mozilla/pdf.js/blob/master/examples/learning/prevnext.html#L76如何等待完成:

  ...
  var renderTask = page.render(renderContext);
  // Wait for rendering to finish
  renderTask.promise.then(function () {
    // Page rendered, now take snapshot.
  });
  ...

【讨论】:

  • 万岁!非常感谢您的帮助,非常感谢!这当然是我的问题。我不熟悉 promises 并自己使用回调函数,并且不清楚如何做到这一点或需要完成。
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 2020-10-25
  • 2014-05-04
  • 2021-07-25
  • 2019-09-18
  • 2017-10-28
  • 2014-07-04
相关资源
最近更新 更多