org.apache.fop.fo.flow.ExternalGraphic捕获并记录ImageException我要处理的自己

时间:2019-03-12 10:38:00

标签: apache exception apache-fop apache-xml-graphics

出于测试目的,我正在将Image转换为pdf。

为了确保以后图像与打印过程兼容,我在上传过程中运行了快速测试打印。

我正在用变压器创建一个简单的Test-PDF。当我尝试打印格式不兼容的图像时,转换器的ImageManager从preloadImage()函数开始抛出ImageException:

  public ImageInfo preloadImage(String uri, Source src)
            throws ImageException, IOException {
        Iterator iter = registry.getPreloaderIterator();
        while (iter.hasNext()) {
            ImagePreloader preloader = (ImagePreloader)iter.next();
            ImageInfo info = preloader.preloadImage(uri, src, imageContext);
            if (info != null) {
                return info;
            }
        }
        throw new ImageException("The file format is not supported. No ImagePreloader found for "
                + uri);
    }

扔给:

   public ImageInfo needImageInfo(String uri, ImageSessionContext session, ImageManager manager)
                throws ImageException, IOException {
            //Fetch unique version of the URI and use it for synchronization so we have some sort of
            //"row-level" locking instead of "table-level" locking (to use a database analogy).
            //The fine locking strategy is necessary since preloading an image is a potentially long
            //operation.
            if (isInvalidURI(uri)) {
                throw new FileNotFoundException("Image not found: " + uri);
            }
            String lockURI = uri.intern();
            synchronized (lockURI) {
                ImageInfo info = getImageInfo(uri);
                if (info == null) {
                    try {
                        Source src = session.needSource(uri);
                        if (src == null) {
                            registerInvalidURI(uri);
                            throw new FileNotFoundException("Image not found: " + uri);
                        }
                        info = manager.preloadImage(uri, src);
                        session.returnSource(uri, src);
                    } catch (IOException ioe) {
                        registerInvalidURI(uri);
                        throw ioe;
                    } catch (ImageException e) {
                        registerInvalidURI(uri);
                        throw e;
                    }
                    putImageInfo(info);
                }
                return info;
            }
        }

扔给:

public ImageInfo getImageInfo(String uri, ImageSessionContext session)
                throws ImageException, IOException {
        if (getCache() != null) {
            return getCache().needImageInfo(uri, session, this);
        } else {
            return preloadImage(uri, session);
        }
    }

最后,它被捕获并登录到ExternalGraphic.class:

 /** {@inheritDoc} */
    public void bind(PropertyList pList) throws FOPException {
        super.bind(pList);
        src = pList.get(PR_SRC).getString();

        //Additional processing: obtain the image's intrinsic size and baseline information
        url = URISpecification.getURL(src);
        FOUserAgent userAgent = getUserAgent();
        ImageManager manager = userAgent.getFactory().getImageManager();
        ImageInfo info = null;
        try {
            info = manager.getImageInfo(url, userAgent.getImageSessionContext());
        } catch (ImageException e) {
            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
                    getUserAgent().getEventBroadcaster());
            eventProducer.imageError(this, url, e, getLocator());
        } catch (FileNotFoundException fnfe) {
            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
                    getUserAgent().getEventBroadcaster());
            eventProducer.imageNotFound(this, url, fnfe, getLocator());
        } catch (IOException ioe) {
            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
                    getUserAgent().getEventBroadcaster());
            eventProducer.imageIOError(this, url, ioe, getLocator());
        }
        if (info != null) {
            this.intrinsicWidth = info.getSize().getWidthMpt();
            this.intrinsicHeight = info.getSize().getHeightMpt();
            int baseline = info.getSize().getBaselinePositionFromBottom();
            if (baseline != 0) {
                this.intrinsicAlignmentAdjust
                    = FixedLength.getInstance(-baseline);
            }
        }
    }

那样,我在使用转换器的代码中无法访问它。

我尝试使用自定义的ErrorListener,但是转换器仅将fatalErrors注册到ErrorListener。

有什么方法可以访问异常并自己处理它而不更改库代码?

0 个答案:

没有答案