• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Java, PDF

  • Автор темы Azrael
  • Дата начала

garrick

Lotus Team
26.10.2009
1 352
151
BIT
204
FontFactory.registerDirectories() сканирует каталоги
Java:
    /** Register fonts in some probable directories. It usually works in Windows,
     * Linux and Solaris.
     * @return the number of fonts registered
     */   
    public int registerDirectories() {
        int count = 0;
        count += registerDirectory("c:/windows/fonts");
        count += registerDirectory("c:/winnt/fonts");
        count += registerDirectory("d:/windows/fonts");
        count += registerDirectory("d:/winnt/fonts");
        count += registerDirectory("/usr/share/X11/fonts", true);
        count += registerDirectory("/usr/X/lib/X11/fonts", true);
        count += registerDirectory("/usr/openwin/lib/X11/fonts", true);
        count += registerDirectory("/usr/share/fonts", true);
        count += registerDirectory("/usr/X11R6/lib/X11/fonts", true);
        count += registerDirectory("/Library/Fonts");
        count += registerDirectory("/System/Library/Fonts");
        return count;
    }
Ну и внутри каждого
Java:
    /**
     * Register all the fonts in a directory and possibly its subdirectories.
     * @param dir the directory
     * @param scanSubdirectories recursively scan subdirectories if <code>true</true>
     * @return the number of fonts registered
     * @since 2.1.2
     */
    public int registerDirectory(String dir, boolean scanSubdirectories) {
        int count = 0;
        try {
            File file = new File(dir);
            if (!file.exists() || !file.isDirectory())
                return 0;
            String files[] = file.list();
            if (files == null)
                return 0;
            for (int k = 0; k < files.length; ++k) {
                try {
                    file = new File(dir, files[k]);
                    if (file.isDirectory()) {
                        if (scanSubdirectories) {
                            count += registerDirectory(file.getAbsolutePath(), true);
                        }
                    } else {
                        String name = file.getPath();
                        String suffix = name.length() < 4 ? null : name.substring(name.length() - 4).toLowerCase();
                        if (".afm".equals(suffix) || ".pfm".equals(suffix)) {
                            /* Only register Type 1 fonts with matching .pfb files */
                            File pfb = new File(name.substring(0, name.length() - 4) + ".pfb");
                            if (pfb.exists()) {
                                register(name, null);
                                ++count;
                            }
                        } else if (".ttf".equals(suffix) || ".otf".equals(suffix) || ".ttc".equals(suffix)) {
                            register(name, null);
                            ++count;
                        }
                    }
                }
                catch (Exception e) {
                    //empty on purpose
                }
            }
        }
        catch (Exception e) {
            //empty on purpose
        }
        return count;
    }
Если вы уверены, что у вас везде всё одинаково, каталоги и файлы называются одинаково, я бы советовал не использовать registerDirectories(), а "регистрировать" сразу известный каталог. И опять же если вам не нужны все шрифты из каталога Fonts, то лучше сразу регистрировать только конкретные, которые используются в документе. Вообще лазить за чем-либо в каталог Windows плохая идея. Положите нужные шрифты в папку Notes, а ещё лучше в личную папку пользователя и берите их там.
 

evgenyum

Member
17.09.2019
12
0
BIT
44
FontFactory.registerDirectories() сканирует каталоги
Java:
    /** Register fonts in some probable directories. It usually works in Windows,
     * Linux and Solaris.
     * @return the number of fonts registered
     */ 
    public int registerDirectories() {
        int count = 0;
        count += registerDirectory("c:/windows/fonts");
        count += registerDirectory("c:/winnt/fonts");
        count += registerDirectory("d:/windows/fonts");
        count += registerDirectory("d:/winnt/fonts");
        count += registerDirectory("/usr/share/X11/fonts", true);
        count += registerDirectory("/usr/X/lib/X11/fonts", true);
        count += registerDirectory("/usr/openwin/lib/X11/fonts", true);
        count += registerDirectory("/usr/share/fonts", true);
        count += registerDirectory("/usr/X11R6/lib/X11/fonts", true);
        count += registerDirectory("/Library/Fonts");
        count += registerDirectory("/System/Library/Fonts");
        return count;
    }
Ну и внутри каждого
Java:
    /**
     * Register all the fonts in a directory and possibly its subdirectories.
     * @param dir the directory
     * @param scanSubdirectories recursively scan subdirectories if <code>true</true>
     * @return the number of fonts registered
     * @since 2.1.2
     */
    public int registerDirectory(String dir, boolean scanSubdirectories) {
        int count = 0;
        try {
            File file = new File(dir);
            if (!file.exists() || !file.isDirectory())
                return 0;
            String files[] = file.list();
            if (files == null)
                return 0;
            for (int k = 0; k < files.length; ++k) {
                try {
                    file = new File(dir, files[k]);
                    if (file.isDirectory()) {
                        if (scanSubdirectories) {
                            count += registerDirectory(file.getAbsolutePath(), true);
                        }
                    } else {
                        String name = file.getPath();
                        String suffix = name.length() < 4 ? null : name.substring(name.length() - 4).toLowerCase();
                        if (".afm".equals(suffix) || ".pfm".equals(suffix)) {
                            /* Only register Type 1 fonts with matching .pfb files */
                            File pfb = new File(name.substring(0, name.length() - 4) + ".pfb");
                            if (pfb.exists()) {
                                register(name, null);
                                ++count;
                            }
                        } else if (".ttf".equals(suffix) || ".otf".equals(suffix) || ".ttc".equals(suffix)) {
                            register(name, null);
                            ++count;
                        }
                    }
                }
                catch (Exception e) {
                    //empty on purpose
                }
            }
        }
        catch (Exception e) {
            //empty on purpose
        }
        return count;
    }
Если вы уверены, что у вас везде всё одинаково, каталоги и файлы называются одинаково, я бы советовал не использовать registerDirectories(), а "регистрировать" сразу известный каталог. И опять же если вам не нужны все шрифты из каталога Fonts, то лучше сразу регистрировать только конкретные, которые используются в документе. Вообще лазить за чем-либо в каталог Windows плохая идея. Положите нужные шрифты в папку Notes, а ещё лучше в личную папку пользователя и берите их там.
Спасибо!
Как получится, проверю.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 948
609
BIT
251
ещё можно (если немного шрифтов, емнип) забирать из ресурсов (туда их и положить)
т.к. ЛС2Ж - оно на клиенте грузанет...
причины падения - например сам jar в БД (в дизайне)....
возможно сделать через runTime и не мучать нотусню, тогда ронять ничего не будет, и хранить в дизайне или отдельно на диске не нужно...

вот так прям в доке конфигурации я храню всю сборку (артефакт по JetBrain Idea) и разворачиваю в темпы (см. по ссылке), оттуда запускаю и читаю консоль (уже из ЛС)
1711104852858.png


эта конфига запускает жвм нотусни/домины, а есть где можно заюзать внешнюю

1711105021858.png
 
Последнее редактирование:

evgenyum

Member
17.09.2019
12
0
BIT
44
ещё можно (если немного шрифтов, емнип) забирать из ресурсов (туда их и положить)
Четыре шрифта общим объемом около 5 МБ. Если положить шрифты в ресурсы БД, то предполагаю, что клиент эти шрифты будет долго подгружать с сервера. Обработка выполняется на порядки быстрее. Или имеются ввиду какие-то другие ресурсы?
 

garrick

Lotus Team
26.10.2009
1 352
151
BIT
204
Поместить в Database Script в Postopen код, который будет выкладывать файлы шрифтов на диск пользователя, если их там ещё нет. Можно ещё дату файла проверять, чтобы обновлять версии на более новые.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 948
609
BIT
251
Четыре шрифта общим объемом около 5 МБ. Если положить шрифты в ресурсы БД, то предполагаю, что клиент эти шрифты будет долго подгружать с сервера. Обработка выполняется на порядки быстрее. Или имеются ввиду какие-то другие ресурсы?
в сжатом виде 5-ть? кладётся в jar (ресурсы), т.е. в БД оно будет в jar (как результат сборки)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!