loadMissingFonts method

Future<PdfFontLoadResult> loadMissingFonts(
  1. Iterable<PdfFontQuery> queries, {
  2. PdfFontResolveContext context = const PdfFontResolveContext(),
  3. bool reloadFonts = true,
  4. PdfFontLoadProgressCallback? onProgress,
})

Resolves and registers queries.

If reloadFonts is true and at least one font is registered, this calls PdfrxEntryFunctions.reloadFonts after registration. That refreshes the backend font mapper state, but it does not reload already opened documents; callers still need to reopen or reload those documents.

onProgress is called when a resolver reports byte progress while loading font data.

Implementation

Future<PdfFontLoadResult> loadMissingFonts(
  Iterable<PdfFontQuery> queries, {
  PdfFontResolveContext context = const PdfFontResolveContext(),
  bool reloadFonts = true,
  PdfFontLoadProgressCallback? onProgress,
}) async {
  await prepare();
  final loaded = <PdfLoadedFont>[];
  final unresolved = <PdfFontQuery>[];
  final failed = <PdfFontLoadFailure>[];

  for (final query in _deduplicate(queries)) {
    try {
      final resolution = await _resolver.resolve(query, context);
      if (resolution == null) {
        unresolved.add(query);
        continue;
      }
      final targetFace = resolution.targetFace ?? query.face;
      if (_registeredFaces.contains(targetFace)) {
        continue;
      }
      final fontFilePath = resolution.fontFilePath;
      if (fontFilePath != null) {
        await PdfrxEntryFunctions.instance.addFontFile(
          face: targetFace,
          filePath: fontFilePath,
          resolvedFace: resolution.resolvedFace,
        );
        final loadedFont = PdfLoadedFont(
          query: query,
          targetFace: targetFace,
          resolvedFace: resolution.resolvedFace,
          source: resolution.source,
          length: 0,
        );
        _registeredFaces.add(targetFace);
        loaded.add(loadedFont);
        continue;
      }
      final data = await resolution._loadValidatedData(
        onProgress: onProgress == null
            ? null
            : ({required loaded, total}) => onProgress(
                PdfFontLoadProgress(
                  query: query,
                  targetFace: targetFace,
                  resolvedFace: resolution.resolvedFace,
                  source: resolution.source,
                  loaded: loaded,
                  total: total,
                ),
              ),
      );
      await PdfrxEntryFunctions.instance.addFontData(
        face: targetFace,
        data: data,
        resolvedFace: resolution.resolvedFace,
      );
      final loadedFont = PdfLoadedFont(
        query: query,
        targetFace: targetFace,
        resolvedFace: resolution.resolvedFace,
        source: resolution.source,
        length: data.length,
      );
      _registeredFaces.add(targetFace);
      loaded.add(loadedFont);
    } catch (error, stackTrace) {
      failed.add(PdfFontLoadFailure(query: query, error: error, stackTrace: stackTrace));
    }
  }

  if (reloadFonts && loaded.isNotEmpty) {
    await PdfrxEntryFunctions.instance.reloadFonts();
  }
  return PdfFontLoadResult(
    loaded: loaded,
    unresolved: unresolved,
    failed: failed,
    fontsReloaded: reloadFonts && loaded.isNotEmpty,
  );
}