June 28th, 2017

Extracting pages from a PDF document and saving them as separate image files, JavaScript edition with async

Last time, we converted the JavaScript version of the PDF Document sample program so that it saved the pages to disk as image files. The asynchonous behavior was expressed via Promises. Today we’ll use the async and await keywords which didn’t make ECMAScript 7, but may make it into ECMAScript 8. Support for it arrived in Microsoft Edge as an experimental feature back in 2015.

async function viewPage() {
  WinJS.log && WinJS.log("", "sample", "status");

  var pageNumber = parseInt(pageNumberBox.value, 10);
  if (isNaN(pageNumber) || (pageNumber < 1) ||
    (pageNumber > pdfDocument.pageCount)) {
    WinJS.log && WinJS.log("Invalid page number.", "sample", "error");
    return;
  }

  output.src = "";
  progressControl.style.display = "block";

  // Convert from 1-based page number to 0-based page index.
  var pageIndex = pageNumber - 1;

  var page = pdfDocument.getPage(pageIndex);

  var picker = new Windows.Storage.Pickers.FileSavePicker();
  picker.fileTypeChoices["PNG image2"] = [".png"];
  var outfile = await picker.pickSaveFileAsync();
  if (outfile) {
    var transaction = await outfile.openTransactedWriteAsync();
    var options = new PdfPageRenderOptions();
    options.destinationHeight = page.size.height * 2;
    options.destinationWidth = page.size.width * 2;
    await page.renderToStreamAsync(transaction.stream, options);
    transaction.close();
  }
  page.close();
  progressControl.style.display = "none";
}

The async and await keywords are analogous to their C# counterparts. Declaring a function as async causes it to return a Promise whose result is the nominal type of the function. Inside an async function, you can use the await keyword to cause the continuation to be connected to the resolution of the Promise you are awaiting.

There’s not much interesting to discuss here; it’s a straightforward translation of the C# sample. Note that JavaScript doesn’t have a using keyword, so we have to close() the closable objects manually.

Next time, we’ll move on to C++/CX.

Topics
Code

Author

Raymond has been involved in the evolution of Windows for more than 30 years. In 2003, he began a Web site known as The Old New Thing which has grown in popularity far beyond his wildest imagination, a development which still gives him the heebie-jeebies. The Web site spawned a book, coincidentally also titled The Old New Thing (Addison Wesley 2007). He occasionally appears on the Windows Dev Docs Twitter account to tell stories which convey no useful information.

0 comments

Discussion are closed.