Java, PDF

  • Автор темы Автор темы Azrael
  • Дата начала Дата начала
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, а ещё лучше в личную папку пользователя и берите их там.
 
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, а ещё лучше в личную папку пользователя и берите их там.
Спасибо!
Как получится, проверю.
 
ещё можно (если немного шрифтов, емнип) забирать из ресурсов (туда их и положить)
т.к. ЛС2Ж - оно на клиенте грузанет...
причины падения - например сам jar в БД (в дизайне)....
возможно сделать через runTime и не мучать нотусню, тогда ронять ничего не будет, и хранить в дизайне или отдельно на диске не нужно...

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


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

1711105021858.png
 
Последнее редактирование:
ещё можно (если немного шрифтов, емнип) забирать из ресурсов (туда их и положить)
Четыре шрифта общим объемом около 5 МБ. Если положить шрифты в ресурсы БД, то предполагаю, что клиент эти шрифты будет долго подгружать с сервера. Обработка выполняется на порядки быстрее. Или имеются ввиду какие-то другие ресурсы?
 
Поместить в Database Script в Postopen код, который будет выкладывать файлы шрифтов на диск пользователя, если их там ещё нет. Можно ещё дату файла проверять, чтобы обновлять версии на более новые.
 
Четыре шрифта общим объемом около 5 МБ. Если положить шрифты в ресурсы БД, то предполагаю, что клиент эти шрифты будет долго подгружать с сервера. Обработка выполняется на порядки быстрее. Или имеются ввиду какие-то другие ресурсы?
в сжатом виде 5-ть? кладётся в jar (ресурсы), т.е. в БД оно будет в jar (как результат сборки)
 
Мы в соцсетях:

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