sábado, 26 de enero de 2019

Apache FOP y autenticación HTTP Basic

Ya estuvimos hablando aquí sobre como generar ficheros PDF con Apache FOP. Ahora voy a comentaros un asunto más del tema que puede ser mas o menos común y del cual no hay demasiada información: Como obtener imagenes o recursos de la red que requieran autenticación HTTP Basic. 

En versiones anteriores de Apache FOP se utilizaba 'FOURIResolver' y podeis encontrar más información aquí. A partir de la versión 1.0 las cosas cambiaron y ahora no tienen una clase con un método tan concreto, pero se sigue haciendo de una forma similar. 

Lo primero es crear una clase que implemente la interfaz 'URIResolver'. A través de esta interfaz implementaremos el método 'resolve' que nos dará la posibilidad de obtener el recurso pasado como parámetro de entrada de la forma que nosotros deseemos. En este caso obtendremos una imagen alojada en un servidor con autenticación HTTP Basic. 

public class BasicAuthenticationURIResolver implements URIResolver {
 private String user, password;
 public BasicAuthenticationURIResolver(String user, String password){
  this.user = user;
  this.password = password;
 }
 @Override
 public Source resolve(final String href, final String base) throws TransformerException {
  try {
   if (href.startsWith("https")) {
    URL url = new URL(href);
    String credential = user+":"+password;
    String encoded = Base64.getEncoder()
      .encodeToString(credential.getBytes(StandardCharsets.UTF_8));
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Authorization", "Basic " + encoded);
    return new StreamSource(connection.getInputStream());
   } else {
    return new StreamSource(IOUtils.toInputStream(href));
   }
  } catch (IOException e) {
   throw new RuntimeException(e);
  }
 }
}

El siguiente paso, será asociar este 'URIResolver' a nuestro generador de PDF, a través del 'fopFactory'. De la siguiente forma:

URIResolverAdapter uriResolverAdapter = new URIResolverAdapter(new BasicAuthenticationURIResolver("user","password"));
FopFactoryBuilder builder = new FopFactoryBuilder(URI.create("/"), uriResolverAdapter);
FopFactory fopFactory = builder.build();

Y suponiendo que usasemos un XSLT deberiamos indicar que queremos obtener la imagen a través de una url, de la siguiente forma:

<fo:block>
    <fo:external-graphic src="url('https://....')"/>
</fo:block>

No hay comentarios:

Publicar un comentario