Pregunta

Estoy usando el platillo volador para crear un PDF a partir de XHTML, alojado en un servidor Tomcat. La mayoría de las imágenes incluidas en el PDF están disponibles públicamente (logotipos, etc.), pero algunas de ellas están protegidas detrás de un inicio de sesión (es decir, se transmiten a través de un servlet si el usuario está conectado).

Cuando pego la URL en el navegador, la imagen, por supuesto, se muestra bien, porque el navegador envía la sesión con la solicitud. Pero cuando Flying Saucer representa el PDF, no incluye la imagen protegida porque no sabe nada sobre la sesión.

Entonces, mi pregunta es; ¿Hay alguna forma de incluir las transmisiones de bytes para que se resuelva el platillo volador, así como es posible agregar fuentes resolutables? He intentado algo como este, pero no hay una manera fácil de establecer la UAC en el ITEXTRENDER, y se quejó cada vez que lo intenté.

¿Fue útil?

Solución

Puede establecer el UserAgentCallback de esta manera, y Flying Saucer lo usará para resolver las URL (probadas, funciona con la versión 8):

ITextRenderer renderer = new ITextRenderer();
renderer.getSharedContext().setUserAgentCallback(new MyUAC());

Myuac debería extender el NaiveUserAgent, y anular el resolveAndOpenStream Método como sugiere la otra página.

Otros consejos

También anulé ItextUseragent: de la fuente, parece que eso es lo que usa ItExtrenderer. Debe proporcionar el dispositivo de salida en el constructor, que puede obtener del objeto Renderer. Otro Gotcha fue que tienes que establecer el "contexto compartido" explícitamente usando el método Setter; de lo contrario, obtendrás un NPE durante la representación. Aquí está el código para configurar el objeto:

ITextRenderer renderer = new ITextRenderer();
MyUserAgentCallback uac = new MyUserAgentCallback(renderer.getOutputDevice());
uac.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(uac);

Además, aquí está la idea básica de MyUseragentCallback, usando la autenticación básica:

private static class MyUserAgentCallback extends ITextUserAgent
{
    public MyUserAgentCallback(ITextOutputDevice outputDevice)
    {
        super(outputDevice);
    }

    @Override
    protected InputStream resolveAndOpenStream(String uri) 
    {
        if (_isProtectedResource(uri))
        {
            java.io.InputStream is = null;
            uri = resolveURI(uri);
            try {
                URL url = new URL(uri);
                String encoding = new BASE64Encoder().encode ("username:password".getBytes());
                URLConnection uc = url.openConnection();
                uc.setRequestProperty  ("Authorization", "Basic " + encoding);
                is = uc.getInputStream();
                Log.debug("got input stream");
            }
            catch (java.net.MalformedURLException e) {
                Log.error("bad URL given: " + uri, e);
            }
            catch (java.io.FileNotFoundException e) {
                Log.error("item at URI " + uri + " not found");
            }
            catch (java.io.IOException e) {
                Log.error("IO problem for " + uri, e);
            }
            return is;
        }
        else
        {
            return super.resolveAndOpenStream(uri);
        }
    }

    private boolean _isProtectedResource(String uri)
    {
        // does this require authentication?
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top