PDF Размер кеша 'Itext User Agent' и как его очистить - PullRequest
0 голосов
/ 10 декабря 2018

Мой код использует библиотеку «Агент пользователя летающей тарелки» для генерации PDF / PPT-файлов из HTML-шаблонов.

Теперь проблема в том, что Itext использует кеш-систему для доступа к изображениям и другим ресурсам через кеш вместовызов внешнего URL.Я хочу знать, как очистить этот кеш, или сколько нужно, чтобы обновить.Я понятия не имею, что я отчаянный и невежественный здесь, так как я даже не могу понять этот инструмент из-за отсутствия хорошей документации.

1- Можете ли вы объяснить, какова роль ReplacedElementFactory.

2- И при исследовании библиотеки я нашел метод:

    public ImageResource getImageResource(String uri) {
    ImageResource resource = null;
    uri = this.resolveURI(uri);
    resource = (ImageResource)this._imageCache.get(uri);
    if (resource == null) {
        InputStream is = this.resolveAndOpenStream(uri);
        if (is != null) {
            try {
                URL url = new URL(uri);
                if (url.getPath() != null && url.getPath().toLowerCase().endsWith(".pdf")) {
                    PdfReader reader = this._outputDevice.getReader(url);
                    PDFAsImage image = new PDFAsImage(url);
                    Rectangle rect = reader.getPageSizeWithRotation(1);
                    image.setInitialWidth(rect.getWidth() * this._outputDevice.getDotsPerPoint());
                    image.setInitialHeight(rect.getHeight() * this._outputDevice.getDotsPerPoint());
                    resource = new ImageResource(uri, image);
                } else {
                    Image image = Image.getInstance(this.readStream(is));
                    this.scaleToOutputResolution(image);
                    resource = new ImageResource(uri, new ITextFSImage(image));
                }

                this._imageCache.put(uri, resource);
            } catch (Exception var16) {
                XRLog.exception("Can't read image file; unexpected problem for URI '" + uri + "'", var16);
            } finally {
                try {
                    is.close();
                } catch (IOException var15) {
                    ;
                }

            }
        }
    }

, который содержит эту строку кода resource = (ImageResource)this._imageCache.get(uri);

Я предполагаю, что именно здесьизображение из кэша вместо поиска более новой версии изображения.

3- Как часто Itext обновляет свой кэш, и каков его размер в первую очередь, и как мне указать путь к нему, какэто хранит это?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 12 декабря 2018

Резюме : Решение ОП, вероятно, использовало решение внизу №.(3): Отключение кэша с помощью параметра / файла конфигурации командной строки.

Этот код не из iText, а из самого flyingsaucer , но поскольку вы только копируете и вставляетеодин способ, на который людям действительно трудно ответить.

Как вы можете видеть сверху, размер кэша составляет 32 private static final int IMAGE_CACHE_CAPACITY = 32;.

Как вы также можете видетьв коде ключ - это URI resource = (ImageResource) _imageCache.get(uriStr); или _imageCache.put(uriStr, resource);

Так что если ваши изображения в удаленном местоположении изменяются, но URI остается тем же, выЯ получу старые изображения.Таким образом, у вас есть несколько вариантов:

  1. Отключить кеш
  2. Добавить механизм аннулирования.Это может быть основано на времени.Например, вы знаете, что ваши изображения на вашем сервере меняются каждые 6 часов, а затем соответственно устанавливаете время аннулирования
  3. Добавьте хэш, чтобы проверить, изменилось ли изображение ...

Обновление: Мне все еще не совсем понятно, чего вы хотите?Вы хотите отключить функцию кэширования без изменения кода?

  1. Вы можете изменить URI изображения (например, добавить случайное число ...) каждый раз, когда изображения изменяются (таким образом, делая его уникальным).Это дает преимущество, если изображение может быть повторно использовано, оно будет быстрее.
  2. Вы можете попробовать позвонить clearImageCache(), что очистит кэш или [shrinkImage][2], и старые изображения будут удалены (если их больше 32)
  3. Или вы отключите кэш с помощью FlyinSaucer Configuration (например, установите его в 0).Ключ, который вы ищете - xr.image.cache-capacity.Вы можете использовать файл конфигурации (local.xhtmlrenderer.conf) или указать его в качестве параметра java -Dxr.image.cache-capacity=0.
...