Страницы

Поиск по вопросам

Показаны сообщения с ярлыком поиск-библиотек. Показать все сообщения
Показаны сообщения с ярлыком поиск-библиотек. Показать все сообщения

пятница, 28 февраля 2020 г.

Чем в .NET можно проверить орфографию в русском тексте?

#c_sharp #net #поиск_библиотек #проверка_орфографии


Нашел вот это, но русского к сожалению нет...

Интересуют бесплатные решения.

Вроде, как-то воспользоваться API MS Office и получать результаты, но interop тормозной.
    


Ответы

Ответ 1



Windows 8 - 10 Можно использовать стандартный Spell Checking API. Словари для проверки орфографии устанавливаются с языковым пакетом, так что при наличии русскоязычной Windows русский язык будет поддерживаться. Объявим необходимые интерфейсы: using System.Runtime.InteropServices; namespace ConsoleApplication1 { public class SpellCheckAPI { public enum WORDLIST_TYPE { WORDLIST_TYPE_IGNORE, WORDLIST_TYPE_ADD, WORDLIST_TYPE_EXCLUDE, WORDLIST_TYPE_AUTOCORRECT, } public enum CORRECTIVE_ACTION { CORRECTIVE_ACTION_NONE, CORRECTIVE_ACTION_GET_SUGGESTIONS, CORRECTIVE_ACTION_REPLACE, CORRECTIVE_ACTION_DELETE, } [Guid("B7C82D61-FBE8-4B47-9B27-6C0D2E0DE0A3")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComImport] public interface ISpellingError { uint StartIndex { get; } uint Length { get; } SpellCheckAPI.CORRECTIVE_ACTION CorrectiveAction { get; } string Replacement { [return: MarshalAs(UnmanagedType.LPWStr)] get; } } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("803E3BD4-2828-4410-8290-418D1D73C762")] [ComImport] public interface IEnumSpellingError { [return: MarshalAs(UnmanagedType.Interface)] SpellCheckAPI.ISpellingError Next(); } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("00000101-0000-0000-C000-000000000046")] [ComImport] public interface IEnumString { void Next([In] uint celt, [MarshalAs(UnmanagedType.LPWStr)] out string rgelt, out uint pceltFetched); void Skip([In] uint celt); void Reset(); void Clone([MarshalAs(UnmanagedType.Interface)] out SpellCheckAPI.IEnumString ppenum); } [Guid("432E5F85-35CF-4606-A801-6F70277E1D7A")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComImport] public interface IOptionDescription { string Id { [return: MarshalAs(UnmanagedType.LPWStr)] get; } string Heading { [return: MarshalAs(UnmanagedType.LPWStr)] get; } string Description { [return: MarshalAs(UnmanagedType.LPWStr)] get; } SpellCheckAPI.IEnumString Labels { [return: MarshalAs(UnmanagedType.Interface)] get; } } [Guid("0B83A5B0-792F-4EAB-9799-ACF52C5ED08A")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComImport] public interface ISpellCheckerChangedEventHandler { void Invoke([MarshalAs(UnmanagedType.Interface), In] SpellCheckAPI.ISpellChecker sender); } [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("B6FD0B71-E2BC-4653-8D05-F197E412770B")] [ComImport] public interface ISpellChecker { string languageTag { [return: MarshalAs(UnmanagedType.LPWStr)] get; } [return: MarshalAs(UnmanagedType.Interface)] SpellCheckAPI.IEnumSpellingError Check([MarshalAs(UnmanagedType.LPWStr), In] string text); [return: MarshalAs(UnmanagedType.Interface)] SpellCheckAPI.IEnumString Suggest([MarshalAs(UnmanagedType.LPWStr), In] string word); void Add([MarshalAs(UnmanagedType.LPWStr), In] string word); void Ignore([MarshalAs(UnmanagedType.LPWStr), In] string word); void AutoCorrect([MarshalAs(UnmanagedType.LPWStr), In] string from, [MarshalAs(UnmanagedType.LPWStr), In] string to); byte GetOptionValue([MarshalAs(UnmanagedType.LPWStr), In] string optionId); SpellCheckAPI.IEnumString OptionIds { [return: MarshalAs(UnmanagedType.Interface)] get; } string Id { [return: MarshalAs(UnmanagedType.LPWStr)] get; } string LocalizedName { [return: MarshalAs(UnmanagedType.LPWStr)] get; } uint add_SpellCheckerChanged([MarshalAs(UnmanagedType.Interface), In] SpellCheckAPI.ISpellCheckerChangedEventHandler handler); void remove_SpellCheckerChanged([In] uint eventCookie); [return: MarshalAs(UnmanagedType.Interface)] SpellCheckAPI.IOptionDescription GetOptionDescription([MarshalAs(UnmanagedType.LPWStr), In] string optionId); [return: MarshalAs(UnmanagedType.Interface)] SpellCheckAPI.IEnumSpellingError ComprehensiveCheck([MarshalAs(UnmanagedType.LPWStr), In] string text); } [Guid("8E018A9D-2415-4677-BF08-794EA61F94BB")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComImport] public interface ISpellCheckerFactory { SpellCheckAPI.IEnumString SupportedLanguages { [return: MarshalAs(UnmanagedType.Interface)] get; } int IsSupported([MarshalAs(UnmanagedType.LPWStr), In] string languageTag); [return: MarshalAs(UnmanagedType.Interface)] SpellCheckAPI.ISpellChecker CreateSpellChecker([MarshalAs(UnmanagedType.LPWStr), In] string languageTag); } [Guid("AA176B85-0E12-4844-8E1A-EEF1DA77F586")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [ComImport] public interface IUserDictionariesRegistrar { void RegisterUserDictionary([MarshalAs(UnmanagedType.LPWStr), In] string dictionaryPath, [MarshalAs(UnmanagedType.LPWStr), In] string languageTag); void UnregisterUserDictionary([MarshalAs(UnmanagedType.LPWStr), In] string dictionaryPath, [MarshalAs(UnmanagedType.LPWStr), In] string languageTag); } [Guid("7AB36653-1796-484B-BDFA-E74F1DB7C1DC")] [ComImport] public class SpellCheckerFactoryClass { } } } Тогда метод для проверки правописания можно реализовать так: public static string SpellCheck(string s) { SpellCheckAPI.SpellCheckerFactoryClass factory = null; SpellCheckAPI.ISpellCheckerFactory ifactory = null; SpellCheckAPI.ISpellChecker checker = null; SpellCheckAPI.ISpellingError error = null; SpellCheckAPI.IEnumSpellingError errors = null; SpellCheckAPI.IEnumString suggestions = null; StringBuilder sb = new StringBuilder(s.Length * 10); try { factory = new SpellCheckAPI.SpellCheckerFactoryClass(); ifactory = (SpellCheckAPI.ISpellCheckerFactory)factory; //проверим поддержку русского языка int res = ifactory.IsSupported("ru-RU"); if (res == 0) { throw new Exception("Fatal error: russian language not supported!"); } checker = ifactory.CreateSpellChecker("ru-RU"); errors = checker.Check(s); while (true) { if (error != null) { Marshal.ReleaseComObject(error); error = null; } error = errors.Next(); if (error == null) break; //получаем слово с ошибкой string word = s.Substring((int)error.StartIndex, (int)error.Length); sb.AppendLine("Ошибка в слове: " + word); //получаем рекомендуемое действие switch (error.CorrectiveAction) { case SpellCheckAPI.CORRECTIVE_ACTION.CORRECTIVE_ACTION_DELETE: sb.AppendLine("Рекомендуемое действие: удалить"); break; case SpellCheckAPI.CORRECTIVE_ACTION.CORRECTIVE_ACTION_REPLACE: sb.AppendLine("Рекомендуемое действие: заменить на " + error.Replacement); break; case SpellCheckAPI.CORRECTIVE_ACTION.CORRECTIVE_ACTION_GET_SUGGESTIONS: sb.AppendLine("Рекомендуемое действие: заменить на одно из следующих слов"); if (suggestions != null) { Marshal.ReleaseComObject(suggestions); suggestions = null; } //получаем список слов, предложенных для замены suggestions = checker.Suggest(word); sb.Append("[ "); while (true) { string suggestion; uint count = 0; suggestions.Next(1, out suggestion, out count); if (count == 1) sb.Append(suggestion + " "); else break; } sb.Append("] "); sb.AppendLine(); break; } sb.AppendLine(); } } finally { if (suggestions != null) { Marshal.ReleaseComObject(suggestions); } if (factory != null) { Marshal.ReleaseComObject(factory); } if (ifactory != null) { Marshal.ReleaseComObject(ifactory); } if (checker != null) { Marshal.ReleaseComObject(checker); } if (error != null) { Marshal.ReleaseComObject(error); } if (errors != null) { Marshal.ReleaseComObject(errors); } } return sb.ToString(); } Windows Vista - 7 Можно использовать TextBox из WPF, тесты показали, что он отлично работает в не-WPF проекте без необходимости создания цикла обработки сообщений и добавления его в окно. Нужно лишь добавить ссылки на PresentationCore, PresentationFramework, WindowsBase и System.Xaml, а также пометить поток STAThread. Из коробки русский язык не поддерживается, поэтому придется скачать словарь, например здесь, и добавить его как нестандартный. Файл словаря желательно перекодировать в UTF-16 LE с BOM (эта кодировка в блокноте обозначена как "Юникод"), так как словари в других кодировках похоже обрабатываются некорректно. Пример: using System.Windows.Controls; //... public static string SpellCheckWPF(string s) { StringBuilder sb = new StringBuilder(s.Length * 10); TextBox textbox = new TextBox(); textbox.Text = s; textbox.Language = System.Windows.Markup.XmlLanguage.GetLanguage("en-US"); textbox.SpellCheck.IsEnabled = true; //добавим нестандартный словарь из файла textbox.SpellCheck.CustomDictionaries.Add(new Uri(@"ru-RU.dic", UriKind.Relative)); int index = 0; while (true) { //находим ошибку index = textbox.GetNextSpellingErrorCharacterIndex(index, System.Windows.Documents.LogicalDirection.Forward); if (index > s.Length || index < 0) break; var error = textbox.GetSpellingError(index); int len = textbox.GetSpellingErrorLength(index); string word = textbox.Text.Substring(index, len); sb.AppendFormat("Ошибка в слове {0}, рекомендуется заменить на одно из следующих слов: ", word); //выводим список предлагаемых замен foreach (string x in error.Suggestions) { sb.Append(x + "; "); } sb.AppendLine(); //переход к следующему слову index += len; } return sb.ToString(); } Поскольку загрузка большого словаря занимает существенное время, нужно создать один TextBox, загрузить в него словарь один раз при запуске приложения и в последующем коде использовать его (а не грузить словарь каждый раз, когда нужно что-то проверить). Данный код не будет работать в Windows 8.1+ и .NET 4.6.1+, так как в этих версиях WPF также использует вышеописанный стандартный API. Механизм загрузки словарей в связи с этим сильно изменился, и большие словари не поддерживаются. Чтобы все нормально заработало в этом случае, нужно убрать нестандартный словарь и устанавливать в TextBox русский язык, а не английский. Источники Using the C++ Spell Checking API WPF in .NET 4.6.1 Spelling checker isn't supported in the .NET 4.6.1 in some conditions

пятница, 24 января 2020 г.

Библиотеки для работы со звуком Java

#java #аудио #поиск_библиотек


Подскажите пожалуйста, как лучше получать сигнал с аудио разъёма пк для последующей
его обработки на java? Есть ли какие - нибудь специальные библиотеки для этой задачи?
    


Ответы

Ответ 1



Думаю в этой статье все детально прописано. Основной код: try { File soundFile = new File("snd.wav"); //Звуковой файл //Получаем AudioInputStream //Вот тут могут полететь IOException и UnsupportedAudioFileException AudioInputStream ais = AudioSystem.getAudioInputStream(soundFile); //Получаем реализацию интерфейса Clip //Может выкинуть LineUnavailableException Clip clip = AudioSystem.getClip(); //Загружаем наш звуковой поток в Clip //Может выкинуть IOException и LineUnavailableException clip.open(ais); clip.setFramePosition(0); //устанавливаем указатель на старт clip.start(); //Поехали!!! //Если не запущено других потоков, то стоит подождать, пока клип не закончится //В GUI-приложениях следующие 3 строчки не понадобятся Thread.sleep(clip.getMicrosecondLength()/1000); clip.stop(); //Останавливаем clip.close(); //Закрываем } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) { exc.printStackTrace(); } catch (InterruptedException exc) {}

среда, 25 декабря 2019 г.

Создание штрих-кода и его печать C#

#c_sharp #net #поиск_библиотек #штрихкод #barcode


Я получаю из БД данные, содержащие уникальные поля. Мне нужно создать штрих-код для
выбранного элемента по уникальному полю в формате code-128 и сразу же вывести диалоговое
окна сохранить/распечатать. Вопрос в следующем, как в C# программно можно создать картинку
штрих-код в формате code-128 и предложить его сохранить как картинку или вывести на
печать? Какие NuGet-пакеты есть для этой цели или же можно обойтись без их использования?
    


Ответы

Ответ 1



Использовал nuget пакет BarcodeLib. Он легок в использовании и кодирует в нужный мне формат. Пример использования вместе с сохранением в PDF файл с помощью библиотеки iTextSharp: private void OnSaveSelectedCells() { var barcode = new BarcodeLib.Barcode(); var saveFileDialog = new SaveFileDialog { FileName = "Barcodes", Filter = "PDF file (*.pdf)|*.pdf" }; if (saveFileDialog.ShowDialog() == true) { var document = new Document(); var fileStream = new FileStream(saveFileDialog.FileName, FileMode.Create, FileAccess.Write, FileShare.None); PdfWriter.GetInstance(document, fileStream); // Для отображения русских букв var baseFont = BaseFont.CreateFont(@"C:\Windows\Fonts\Arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); var font = new iTextSharp.text.Font(baseFont, 14); document.Open(); foreach (var item in items) { var imageBarcode = barcode.Encode(BarcodeLib.TYPE.CODE128B, item.Barcode, Color.Black, Color.White, 290, 120); var image = Image.GetInstance(imageBarcode, ImageFormat.Jpeg); document.Add(new Paragraph(item.Description, font)); document.Add(image); } document.Close(); // Открытие созданного файла System.Diagnostics.Process.Start(saveFileDialog.FileName); } }

воскресенье, 22 декабря 2019 г.

Как определить что произошел импорт класса?

#java #поиск_библиотек


Есть ли библиотеки для java позволяющие на этапе компиляции определить, что некий
класс импортируется там, где это не желательно? 

Как я это вижу:

@VisibleFor(some.packagee.name)
public class AlmostPublic {
    // ...
}


И теперь попытка импортировать класс AlmostPublic в любом месте за пределами пакета
some.packagee.name должна вызвать ошибку компиляции.
    


Ответы

Ответ 1



Если вы хотите следить за командой разработчиков, к которым у вас есть доступ, то вы можете скачать расширение для IntelliJ - Chekstyle-IDEA(вы так же можете скачать его для Maven). Суть такая: вы запускаете проверку, и Chekstyle показывает вам ошибки, т.е. где по "её" мнению код написан в неверном стиле(это по умолчанию). Но вы можете добавить туда собственные фильтры, например import .... Вы даже можете настроить IDEA так, что бы проверки пред компиляцией выполняла Chekstyle(т.е. точно так же, как у вас из-за ошибки не компилируется код, у вас он не будет компилироваться из-за импорта класса, если вы это все настроили). Если вы пишите (допустим) библиотеку, т.е. вы не сможете следить за разработкой программ, кот. используют ваш класс, то как уже писали, вы не можете запретить создание импортов на уровне компиляции. Тогда вы можете запретить создавать объекты своего класса, т.е. определить дефолтный конструктор как default(т.е., вообще без модификатора) - сделать его доступным только внутри пакета(package).

Ответ 2



Добавлю свои пять копеек Плагины к среде разработки это конечно все отлично, но, если вы пытаетесь построить рабочий процесс и хотите быть уверены что все ему следуют то это слегка не тот путь. Есть средства сборки , например Jenkins, у вас при сборке есть стадия, которая запускает SonarCube , который в свою очередь использует принятые у вас в команде проверки кода. Самое главное тут что дальше у вас есть так называемые quality gate, и build breaker , которые сломают сборку, если правила игры нарушены. И разработчик получает email сообщение что он не прав Как то так

воскресенье, 8 декабря 2019 г.

Бесплатная библиотека для работы с *.DOCX

#c_sharp #net #поиск_библиотек #docx


Посоветуйте бесплатную и хорошо документированную библиотеку для работы с *.DOCX.

Знаю, что есть OpenXML, но что есть в природе удобного помимо него?

Например, для Excel есть удобная EpPlus.
    


Ответы

Ответ 1



DocX Git Exp: DocX doc= DocX.Create(filePath); Paragraph p1 = template.InsertParagraph(); p1.AppendLine("This line contains a ").Append("bold").Bold().Append(" word."); p1.AppendLine("Here is example with question mark?"); p1.AppendLine(); p1.AppendLine("Can you help me figure it out?"); p1.AppendLine(); Очень проста в использовании.

Ответ 2



Есть такая open-source С++ библиотека DocxFactory для генерации DOCX документов. Для неё в том числе есть обертка для C#. Прикладываю ссылку на туториал. Судя по документации, основной функционал работы она поддерживает(сам не пробовал использовать на проектах). В документации имеются куски примеров по работе с DOCX. Также ссылка на github-проект. Если требуется, можно попробовать создать какой-то экзампел.

Ответ 3



Microsoft.Office.Interop.Word Как известно, Microsoft Word является COM-объектом, т.е. спроектирован таким образом, что позволяет другим программам подключаться к себе и управлять им. Программно можно проделать практически все операции, которые мы делаем вручную в Word: создать новый документ, внести в него правки, сохранить его и т.п. Но для ее работы требуется лицензия MS Office на каждом клиентском компьютере. Кроме того, MS Office загружается в фоновом режиме, вследствие чего занимает определенное количество оперативной памяти и загружает большое количество файлов и DLL. Приложения MS Office были разработаны как приложения для пользовательского интерфейса, и поэтому Microsoft.Office.Interop.Word работает очень медленно. Microsoft не рекомендует использовать Office Automation (или любой Office Interop) на сервере. DocumentFormat.OpenXml Open XML SDK предоставляет инструменты для работы с документами Office Word, Excel и PowerPoint. Он поддерживает такие сценарии, как заполнение содержимого в файлах Word из источника данных XML, разделение (измельчение) файла Word или PowerPoint на несколько файлов и объединение нескольких файлов Word, поиск и замена контента с использованием регулярных выражений. Но при присвоении некоторого стиля, в свойствах предоставляется только идентификатор предоставленого стиля, а сам стиль описывается отдельно в файле style.xml. В результате необходимости регулярного сопоставления ID стиля с контейнером style.xml для получения характеристик стилей абзацев, возрастает сложность программного использования библиотеки. link Spire.Doc Spire.Doc для .NET - это полностью независимая библиотека классов .NET Word, специально созданная для разработчиков, которая позволяет быстро генерировать, открывать, писать, редактировать и сохранять документы Word не требует установки в систему каждого пользователя MS Office, то есть возможность полностью независимой от него работы; объемная документация с примерами и пояснениями. Работать с библиотекой достатосно удобно. Однако полная версия Spire.Doc не является бесплатной, а бесплатная версия, FreeSpire.Doc, имеет определенные ограничения (например обработка не более 500 абзацев и 25 таблиц). link

пятница, 23 ноября 2018 г.

Как определить что произошел импорт класса?

Есть ли библиотеки для java позволяющие на этапе компиляции определить, что некий класс импортируется там, где это не желательно?
Как я это вижу:
@VisibleFor(some.packagee.name) public class AlmostPublic { // ... }
И теперь попытка импортировать класс AlmostPublic в любом месте за пределами пакета some.packagee.name должна вызвать ошибку компиляции.


Ответ

Если вы хотите следить за командой разработчиков, к которым у вас есть доступ, то вы можете скачать расширение для IntelliJ - Chekstyle-IDEA(вы так же можете скачать его для Maven). Суть такая: вы запускаете проверку, и Chekstyle показывает вам ошибки, т.е. где по "её" мнению код написан в неверном стиле(это по умолчанию). Но вы можете добавить туда собственные фильтры, например import .... Вы даже можете настроить IDEA так, что бы проверки пред компиляцией выполняла Chekstyle(т.е. точно так же, как у вас из-за ошибки не компилируется код, у вас он не будет компилироваться из-за импорта класса, если вы это все настроили).
Если вы пишите (допустим) библиотеку, т.е. вы не сможете следить за разработкой программ, кот. используют ваш класс, то как уже писали, вы не можете запретить создание импортов на уровне компиляции. Тогда вы можете запретить создавать объекты своего класса, т.е. определить дефолтный конструктор как default(т.е., вообще без модификатора) - сделать его доступным только внутри пакета(package).