raster method
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();
}
}