Укажите параметры загрузки
При загрузке документа вы можете задать некоторые дополнительные свойства. Aspose.Words предоставляет вам класс LoadOptions, который позволяет более точно управлять процессом загрузки. У некоторых загружаемых форматов есть соответствующий класс, который содержит параметры загрузки для этого загружаемого формата, например, есть PdfLoadOptions для загрузки в формат PDF или TxtLoadOptions для загрузки в TXT. В этой статье приведены примеры работы с параметрами класса LoadOptions.
Установите версию Microsoft Word, чтобы изменить внешний вид
Различные версии приложения Microsoft Word могут отображать документы по-разному. Например, существует хорошо известная проблема с документами OOXML, такими как DOCX или DOTX, созданными с использованием WPS Office. В таком случае основные элементы разметки документа могут отсутствовать или интерпретироваться по-другому, что приводит к тому, что Microsoft Word 2019 отображает такой документ иначе, чем Microsoft Word 2010.
По умолчанию Aspose.Words открывает документы с использованием правил Microsoft Word 2019. Если вам нужно, чтобы загрузка документов происходила так, как это происходило бы в одной из предыдущих версий приложения Microsoft Word, вам следует явно указать желаемую версию, используя свойство MswVersion класса LoadOptions.
В следующем примере кода показано, как установить версию Microsoft Word с параметрами загрузки:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
System::SharedPtr<LoadOptions> loadOptions = System::MakeObject<LoadOptions>(); | |
// Change the loading version to Microsoft Word 2010. | |
loadOptions->set_MswVersion(MsWordVersion::Word2010); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Document.docx", loadOptions); | |
System::String outputPath = outputDataDir + u"Load_Options.SetMSWordVersion.docx"; | |
doc->Save(outputPath); |
Установите языковые настройки, чтобы изменить внешний вид
Особенности отображения документа в Microsoft Word зависят не только от версии приложения и значения параметра MswVersion, но и от языковых настроек. В Microsoft Word документы могут отображаться по-разному в зависимости от настроек диалогового окна “Языковые настройки Office”, которые можно найти в разделе “Файл → Параметры → Язык”. Используя это диалоговое окно, пользователь может выбрать, например, основной язык, языки проверки подлинности, языки отображения и т.д. Aspose.Words предоставляет свойство LanguagePreferences в качестве эквивалента этого диалогового окна. Если выходные данные Aspose.Words отличаются от выходных данных Microsoft Word, установите соответствующее значение для EditingLanguage – это может улучшить качество выходного документа.
В следующем примере кода показано, как задать японский язык как EditingLanguage:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// Create a new LoadOptions object. | |
System::SharedPtr<LoadOptions> loadOptions = System::MakeObject<LoadOptions>(); | |
// Set language preferences that will be used when document is loading. | |
loadOptions->get_LanguagePreferences()->AddEditingLanguage(EditingLanguage::Japanese); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"languagepreferences.docx", loadOptions); |
Используйте WarningCallback для устранения проблем при загрузке документа
Некоторые документы могут быть повреждены, содержать недопустимые записи или содержать функции, которые в настоящее время не поддерживаются Aspose.Words. Если вы хотите узнать о проблемах, возникших при загрузке документа, Aspose.Words предоставляет интерфейс IWarningCallback.
В следующем примере кода показана реализация интерфейса IWarningCallback:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
class DocumentLoadingWarningCallback : public IWarningCallback | |
{ | |
public: | |
System::SharedPtr<WarningInfoCollection> mWarnings; | |
void Warning(System::SharedPtr<WarningInfo> info) override; | |
DocumentLoadingWarningCallback(); | |
}; | |
void DocumentLoadingWarningCallback::Warning(System::SharedPtr<WarningInfo> info) | |
{ | |
// Prints warnings and their details as they arise during document loading. | |
std::cout << "WARNING: {info->get_WarningType} " << std::endl; | |
std::cout << "Source: {info->get_Source} " << std::endl; | |
std::cout << "\tDescription: {info->get_Description} " << std::endl; | |
} | |
DocumentLoadingWarningCallback::DocumentLoadingWarningCallback() : mWarnings(System::MakeObject<WarningInfoCollection>()) | |
{ | |
} |
Чтобы получить информацию обо всех проблемах во время загрузки, используйте свойство WarningCallback
.
В следующем примере кода показано, как использовать это свойство:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// Create a new LoadOptions object and set its WarningCallback property. | |
System::SharedPtr<LoadOptions> loadOptions = System::MakeObject<LoadOptions>(); | |
System::SharedPtr<DocumentLoadingWarningCallback> callback = System::MakeObject<DocumentLoadingWarningCallback>(); | |
loadOptions->set_WarningCallback(callback); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Document.docx", loadOptions); |
Используйте ResourceLoadingCallback для управления загрузкой внешних ресурсов
Документ может содержать внешние ссылки на изображения, расположенные где-либо на локальном диске, в сети или в Интернете. Aspose.Words такие изображения автоматически загружаются в документ, но бывают ситуации, когда этот процесс необходимо контролировать. Например, чтобы решить, действительно ли нам нужно загружать определенное изображение или, возможно, пропустить его. Опция загрузки ResourceLoadingCallback позволяет вам управлять этим.
В следующем примере кода показана реализация интерфейса IResourceLoadingCallback:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
class HtmlLinkedResourceLoadingCallback : public IResourceLoadingCallback | |
{ | |
public: | |
ResourceLoadingAction ResourceLoading(System::SharedPtr<ResourceLoadingArgs> args) override; | |
HtmlLinkedResourceLoadingCallback(); | |
}; | |
HtmlLinkedResourceLoadingCallback::HtmlLinkedResourceLoadingCallback() | |
{ | |
} | |
ResourceLoadingAction HtmlLinkedResourceLoadingCallback::ResourceLoading(System::SharedPtr<ResourceLoadingArgs> args) | |
{ | |
switch (args->get_ResourceType()) | |
{ | |
case ResourceType::CssStyleSheet: | |
{ | |
std::cout << "External CSS Stylesheet found upon loading: " << args->get_OriginalUri().ToUtf8String() << std::endl; | |
// CSS file will don't used in the document | |
return ResourceLoadingAction::Skip; | |
} | |
case ResourceType::Image: | |
{ | |
// Replaces all images with a substitute | |
System::String newImageFilename = u"Logo.jpg"; | |
std::cout << "\tImage will be substituted with: " << newImageFilename.ToUtf8String() << std::endl; | |
System::SharedPtr<System::Drawing::Image> newImage = System::Drawing::Image::FromFile(GetInputDataDir_LoadingAndSaving() + newImageFilename); | |
System::SharedPtr<System::Drawing::ImageConverter> converter = System::MakeObject<System::Drawing::ImageConverter>(); | |
auto imageBytes = System::DynamicCast<System::Array<uint8_t>>(converter->ConvertTo(nullptr, nullptr, newImage, System::ObjectExt::GetType<System::Array<uint8_t>>())); | |
//System::ArrayPtr<uint8_t> imageBytes = System::IO::File::ReadAllBytes(GetInputDataDir_LoadingAndSaving() + newImageFilename); | |
args->SetData(imageBytes); | |
// New images will be used instead of presented in the document | |
return ResourceLoadingAction::UserProvided; | |
} | |
case ResourceType::Document: | |
{ | |
std::cout << "External document found upon loading: " << args->get_OriginalUri().ToUtf8String() << std::endl; | |
// Will be used as usual | |
return ResourceLoadingAction::Default; | |
} | |
default: | |
throw System::InvalidOperationException(u"Unexpected ResourceType value."); | |
} | |
} | |
В следующем примере кода показано, как использовать свойство ResourceLoadingCallback:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// Create a new LoadOptions object and set its ResourceLoadingCallback attribute as an instance of our IResourceLoadingCallback implementation | |
System::SharedPtr<LoadOptions> loadOptions = System::MakeObject<LoadOptions>(); | |
loadOptions->set_ResourceLoadingCallback(System::MakeObject<HtmlLinkedResourceLoadingCallback>()); | |
// When we open an Html document, external resources such as references to CSS stylesheet files and external images | |
// will be handled in a custom manner by the loading callback as the document is loaded | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Images.html", loadOptions); | |
doc->Save(outputDataDir + u"Load_Options.LoadOptionsResourceLoadingCallback.pdf"); |
Используйте TempFolder, чтобы избежать исключения из памяти
Aspose.Words поддерживает очень большие документы, содержащие тысячи страниц с богатым содержанием. Для загрузки таких документов может потребоваться много оперативной памяти. В процессе загрузки Aspose.Words требуется еще больше памяти для хранения временных структур, используемых для синтаксического анализа документа.
Если при загрузке документа у вас возникла проблема с исключением “Нехватка памяти”, попробуйте использовать свойство TempFolder. В этом случае Aspose.Words сохранит некоторые данные во временных файлах вместо памяти, и это может помочь избежать такого исключения.
В следующем примере кода показано, как установить TempFolder:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
System::SharedPtr<LoadOptions> loadOptions = System::MakeObject<LoadOptions>(); | |
loadOptions->set_TempFolder(u"C:/TempFolder/"); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Document.docx", loadOptions); |
Задайте кодировку явно
Большинство современных форматов документов хранят свое содержимое в Юникоде и не требуют специальной обработки. С другой стороны, все еще существует множество документов, в которых используется некоторая кодировка, предшествовавшая Юникоду, и иногда либо отсутствует информация о кодировке, либо она даже не поддерживается по своей природе. Aspose.Words пытается автоматически определить соответствующую кодировку по умолчанию, но в редких случаях вам может потребоваться использовать кодировку, отличную от той, которая определяется нашим алгоритмом распознавания кодировок. В этом случае используйте свойство Encoding, чтобы получить или задать кодировку.
В следующем примере кода показано, как настроить кодировку таким образом, чтобы она переопределяла автоматически выбранную кодировку:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// Set the Encoding attribute in a LoadOptions object to override the automatically chosen encoding with the one we know to be correct | |
System::SharedPtr<LoadOptions> loadOptions = System::MakeObject<LoadOptions>(); | |
loadOptions->set_Encoding(System::Text::Encoding::get_UTF7()); | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"Encoded in UTF-7.txt", loadOptions); |
Загружайте зашифрованные документы
Вы можете загружать документы Word, зашифрованные паролем. Для этого используйте специальный конструктор overload, который принимает объект LoadOptions. Этот объект содержит свойство Password, которое определяет строку пароля.
В следующем примере кода показано, как загрузить документ, зашифрованный паролем:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
// The path to the documents directory. | |
System::String dataDir = GetInputDataDir_LoadingAndSaving(); | |
// Loads encrypted document. | |
System::SharedPtr<Document> doc = System::MakeObject<Document>(dataDir + u"LoadEncrypted.docx", System::MakeObject<LoadOptions>(u"aspose")); | |
Если вы заранее не знаете, зашифрован ли файл, вы можете использовать класс FileFormatUtil, который предоставляет служебные методы для работы с форматами файлов, такие как определение формата файла или преобразование расширений файлов в/из перечислений форматов файлов. Чтобы определить, зашифрован ли документ и требуется ли пароль для его открытия, используйте свойство IsEncrypted
.
В следующем примере кода показано, как проверить, зашифрован OpenDocument или нет:
For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C | |
System::SharedPtr<FileFormatInfo> info = FileFormatUtil::DetectFileFormat(inputDataDir + u"encrypted.odt"); | |
std::cout << info->get_IsEncrypted() << std::endl; |