pdf.js:使用base64文件源而不是url渲染pdf文件


71

我正在尝试使用pdf.js从pdf渲染页面

通常,使用网址,我可以这样做:

PDFJS.getDocument("http://www.server.com/file.pdf").then(function getPdfHelloWorld(pdf) {
  //
  // Fetch the first page
  //
  pdf.getPage(1).then(function getPageHelloWorld(page) {
    var scale = 1.5;
    var viewport = page.getViewport(scale);

    //
    // Prepare canvas using PDF page dimensions
    //
    var canvas = document.getElementById('the-canvas');
    var context = canvas.getContext('2d');
    canvas.height = viewport.height;
    canvas.width = viewport.width;

    //
    // Render PDF page into canvas context
    //
    page.render({canvasContext: context, viewport: viewport});
  });
});

但是在这种情况下,我将文件放在base64中而不是url中:

data:application/pdf;base64,JVBERi0xLjUKJdDUxdgKNSAwIG9iaiA8PAovTGVuZ3RoIDE2NjUgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarVhLc9s2...

如何做到这一点?

Answers:


98

http://mozilla.github.com/pdf.js/build/pdf.js的源代码中

/**
 * This is the main entry point for loading a PDF and interacting with it.
 * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
 * is used, which means it must follow the same origin rules that any XHR does
 * e.g. No cross domain requests without CORS.
 *
 * @param {string|TypedAray|object} source Can be an url to where a PDF is
 * located, a typed array (Uint8Array) already populated with data or
 * and parameter object with the following possible fields:
 *  - url   - The URL of the PDF.
 *  - data  - A typed array with PDF data.
 *  - httpHeaders - Basic authentication headers.
 *  - password - For decrypting password-protected PDFs.
 *
 * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
 */

因此,使用标准XMLHttpRequest(XHR)来检索文档。问题是XMLHttpRequests不支持数据:uris(例如data:application / pdf; base64,JVBERi0xLjUK ...)。

但是有可能将类型化的Javascript数组传递给该函数。您唯一需要做的就是将base64字符串转换为Uint8Array。您可以使用在https://gist.github.com/1032746上找到的此功能

var BASE64_MARKER = ';base64,';

function convertDataURIToBinary(dataURI) {
  var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
  var base64 = dataURI.substring(base64Index);
  var raw = window.atob(base64);
  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;
}

tl; dr

var pdfAsDataUri = "data:application/pdf;base64,JVBERi0xLjUK..."; // shortened
var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
PDFJS.getDocument(pdfAsArray)

1
这样就有可能获取pdf的二进制文件并使用pdf.js在pdf查看器中显示
Dakait 2013年

@Codetoffel节省了我几个小时
Konga Raju

1
辛苦了 但是,如果源是通过RESTful调用通过PDF检索到数组缓冲区或Blob中的,该怎么办?我张贴在这里就可以了问题:stackoverflow.com/questions/24288221/...
witttness

1
如果您进入,别忘了var之前!我一小时没输。:)i = 0strict mode
kube 2015年

我有这个工作。我的答案在这里
toddmo

5

根据示例,虽然我自己尚未测试过,但是直接支持base64编码。将您的base64字符串(从文件导出或使用任何其他方法加载,POST / GET,websockets等),使用atob将其转换为二进制文件,然后将其解析为PDFJS API上的getDocument,就像PDFJS.getDocument({data: base64PdfData});Codetoffel答案确实适用于不过我


1
我已经使用nodejs软件包对它进行了测试,它与PDFJS.getDocument({data: Buffer.from(pdf_base64, 'base64')})
efeder '18

0

使用“接受的答案”检查IE,并将dataURI转换为UInt8Array;PDFJS接受的表格

        Ext.isIE ? pdfAsDataUri = me.convertDataURIToBinary(pdfAsDataUri): '';

        convertDataURIToBinary: function(dataURI) {
          var BASE64_MARKER = ';base64,',
            base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length,
            base64 = dataURI.substring(base64Index),
            raw = window.atob(base64),
            rawLength = raw.length,
            array = new Uint8Array(new ArrayBuffer(rawLength));

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.