Implement this interface if you want to have your own custom method called to capture loss of fidelity warnings that can occur during document loading or saving.
- Examples
Shows how to use the IWarningCallback interface to monitor font substitution warnings.
void SubstitutionWarning()
{
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->get_Font()->set_Name(u"Times New Roman");
builder->Writeln(u"Hello world!");
auto callback = MakeObject<ExFontSettings::FontSubstitutionWarningCollector>();
doc->set_WarningCallback(callback);
ArrayPtr<SharedPtr<FontSourceBase>> originalFontSources = FontSettings::get_DefaultInstance()->GetFontsSources();
FontSettings::get_DefaultInstance()->SetFontsFolder(String::Empty, false);
doc->Save(ArtifactsDir + u"FontSettings.SubstitutionWarning.pdf");
FontSettings::get_DefaultInstance()->SetFontsSources(originalFontSources);
u"Font 'Times New Roman' has not been found. Using 'Fanwood' font instead. Reason: first available font."));
}
class FontSubstitutionWarningCollector : public IWarningCallback
{
public:
SharedPtr<WarningInfoCollection> FontSubstitutionWarnings;
void Warning(SharedPtr<WarningInfo> info)
override
{
{
FontSubstitutionWarnings->Warning(info);
}
}
FontSubstitutionWarningCollector() : FontSubstitutionWarnings(
MakeObject<WarningInfoCollection>())
{
}
};
Shows how to set the property for finding the closest match for a missing font from the available font sources.
void EnableFontSubstitution()
{
auto doc = MakeObject<Document>(MyDir + u"Missing font.docx");
auto substitutionWarningHandler = MakeObject<ExFontSettings::HandleDocumentSubstitutionWarnings>();
doc->set_WarningCallback(substitutionWarningHandler);
auto fontSettings = MakeObject<FontSettings>();
fontSettings->get_SubstitutionSettings()->get_DefaultFontSubstitution()->set_DefaultFontName(u"Arial");
;
fontSettings->get_SubstitutionSettings()->get_FontInfoSubstitution()->set_Enabled(true);
doc->set_FontSettings(fontSettings);
doc->Save(ArtifactsDir + u"FontSettings.EnableFontSubstitution.pdf");
{
SharedPtr<System::Collections::Generic::IEnumerator<SharedPtr<WarningInfo>>> warnings = substitutionWarningHandler->FontWarnings->GetEnumerator();
while (warnings->MoveNext())
{
std::cout << warnings->get_Current()->get_Description() << std::endl;
}
}
ASSERT_EQ(u"Font '28 Days Later' has not been found. Using 'Calibri' font instead. Reason: alternative name from document.",
substitutionWarningHandler->FontWarnings->idx_get(0)->get_Description());
substitutionWarningHandler->FontWarnings->Clear();
ASSERT_EQ(0, substitutionWarningHandler->FontWarnings->get_Count());
}
class HandleDocumentSubstitutionWarnings : public IWarningCallback
{
public:
SharedPtr<WarningInfoCollection> FontWarnings;
void Warning(SharedPtr<WarningInfo> info)
override
{
{
FontWarnings->Warning(info);
}
}
HandleDocumentSubstitutionWarnings() : FontWarnings(
MakeObject<WarningInfoCollection>())
{
}
};
Shows added a fallback to bitmap rendering and changing type of warnings about unsupported metafile records.
void HandleBinaryRasterWarnings()
{
auto doc = MakeObject<Document>(MyDir + u"WMF with image.docx");
auto metafileRenderingOptions = MakeObject<MetafileRenderingOptions>();
metafileRenderingOptions->set_EmulateRasterOperations(false);
metafileRenderingOptions->set_RenderingMode(MetafileRenderingMode::VectorWithFallback);
auto saveOptions = MakeObject<PdfSaveOptions>();
saveOptions->set_MetafileRenderingOptions(metafileRenderingOptions);
auto callback = MakeObject<ExPdfSaveOptions::HandleDocumentWarnings>();
doc->set_WarningCallback(callback);
doc->Save(ArtifactsDir + u"PdfSaveOptions.HandleBinaryRasterWarnings.pdf", saveOptions);
ASSERT_EQ(1, callback->Warnings->get_Count());
ASSERT_EQ(u"'R2_XORPEN' binary raster operation is partly supported.", callback->Warnings->idx_get(0)->get_Description());
}
class HandleDocumentWarnings : public IWarningCallback
{
public:
SharedPtr<WarningInfoCollection> Warnings;
void Warning(SharedPtr<WarningInfo> info)
override
{
{
std::cout << (String(u"Unsupported operation: ") + info->get_Description()) << std::endl;
Warnings->Warning(info);
}
}
HandleDocumentWarnings() : Warnings(
MakeObject<WarningInfoCollection>())
{
}
};