loadMissingFonts method
Future<PdfFontLoadResult>
loadMissingFonts(
- Iterable<
PdfFontQuery> queries, { - PdfFontResolveContext context = const PdfFontResolveContext(),
- bool reloadFonts = true,
- 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,
);
}