raster method

  1. @override
Stream<PdfRaster> raster(
  1. Uint8List document,
  2. List<int>? pages,
  3. double dpi
)

Convert a Pdf document to bitmap images

Implementation

@override
Stream<PdfRaster> raster(
  Uint8List document,
  List<int>? pages,
  double dpi,
) async* {
  await _initPlugin();

  final settings = Settings()..data = document;

  if (!_hasPdfJsLib) {
    settings
      ..cMapUrl = '$_pdfJsUrlBase/cmaps/'
      ..cMapPacked = true;
  }

  final jsDoc = PdfJs.getDocument(settings);
  try {
    final doc = await promiseToFuture<PdfJsDoc>(jsDoc.promise);
    final numPages = doc.numPages;

    final html.CanvasElement canvas =
        js.context['document'].createElement('canvas');

    final context = canvas.getContext('2d') as html.CanvasRenderingContext2D?;
    final computedPages =
        pages ?? Iterable<int>.generate(numPages, (index) => index);

    for (final pageIndex in computedPages) {
      final page =
          await promiseToFuture<PdfJsPage>(doc.getPage(pageIndex + 1));
      try {
        final viewport =
            page.getViewport(Settings()..scale = dpi / PdfPageFormat.inch);

        canvas.height = viewport.height.toInt();
        canvas.width = viewport.width.toInt();

        final renderContext = Settings()
          ..canvasContext = context!
          ..viewport = viewport;

        await promiseToFuture<void>(page.render(renderContext).promise);

        // Convert the image to PNG
        final completer = Completer<void>();
        final blob = await canvas.toBlob();
        final data = BytesBuilder();
        final r = FileReader();
        r.readAsArrayBuffer(blob);
        r.onLoadEnd.listen(
          (ProgressEvent e) {
            data.add(r.result as List<int>);
            completer.complete();
          },
        );
        await completer.future;

        yield _WebPdfRaster(
          canvas.width!,
          canvas.height!,
          data.toBytes(),
        );
      } finally {
        page.cleanup();
      }
    }
  } finally {
    jsDoc.destroy();
  }
}