XSL FO получить изображение с сервера - PullRequest
0 голосов
/ 30 января 2019

Я использую FOP версии 2.1.У меня есть шаблон xsl fo, в котором я хочу показать изображения:

 <xsl:variable name="ImagePath" select="defaultImageUrl"/>
 <fo:external-graphic src="{$ImagePath}" content-width="scale-down-to-fit" width="100%"/>

Некоторые изображения имеют веб-адрес, например:

https://upload.wikimedia.org/wikipedia/commons/thumb/b/b1/Tulipa_biflora_UME.jpg/800px-Tulipa_biflora_UME.jpg

Но другие изображения приходят с моего веб-сервера с адреса, например:

https://localhost:4200/api/download/image/?fixedPrice=true&amp;productId=1329&amp;fileId=1304

Это соответствует конечной точке:

public ResponseEntity<byte[]> getFileAsResponseEntity(@RequestParam boolean fixedPrice, @RequestParam long productId, @RequestParam long fileId) throws IOException, SQLException {
    HttpHeaders headers = new HttpHeaders();
    FileDownload fileDownload = productService.getProductFile(productId, fileId, fixedPrice);
    headers.setCacheControl(CacheControl.noCache().getHeaderValue());
    String n = fileDownload.getFileName().toLowerCase();
    if (fileDownload.getFileTypeEnum().equals(FileTypeEnum.PICTURE) && (n.contains(".jpeg") || n.contains("jpg"))) {
        headers.setContentType(MediaType.IMAGE_JPEG);
    } else if (fileDownload.getFileTypeEnum().equals(FileTypeEnum.PICTURE) && (n.contains(".png"))) {
        headers.setContentType(MediaType.IMAGE_PNG);
    } else if (fileDownload.getFileTypeEnum().equals(FileTypeEnum.PICTURE) && (n.contains(".gif"))) {
        headers.setContentType(MediaType.IMAGE_GIF);
    }
    return new ResponseEntity<>(fileDownload.getByteArray(), headers, HttpStatus.OK);
}

Есть ли способ для fo: external-graphic принять эти 2 разных URL?Или есть что-то дополнительное, что мне нужно сделать, чтобы оно работало, поскольку в настоящее время, когда изображение поступает с веб-сервера, полученный PDF-файл не содержит изображения, а содержит только пробел.

РЕДАКТИРОВАТЬ:Вот код, который должен сделать XML для XSL в PDF:

 byte[] xsl = IOUtils.toByteArray(this.getClass().getResourceAsStream("/browserDocument.xsl"));
    byte[] xml = getBrowserDocument(filter, clientId, representId, ecatMain, showImage, language);
    InputStream inStr = this.getClass().getResourceAsStream("/fop.xml");
    FopFactory fopFactory = FopFactory.newInstance(new java.net.URI("."), inStr);
    ByteArrayOutputStream out = new ByteArrayOutputStream();

    Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

    javax.xml.transform.Source xsltSrc = new StreamSource(new ByteArrayInputStream(xsl));

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer(xsltSrc);

    String xmlStr = new String(xml, "UTF-8");
    xmlStr = xmlStr.replaceAll("<", "<");
    xmlStr = xmlStr.replaceAll(">", ">");

    javax.xml.transform.Source src = new StreamSource(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));
    Result res = new SAXResult(fop.getDefaultHandler());

    transformer.transform(src, res);

    return out.toByteArray();

Я получаю сообщение об ошибке в файлах журнала:

2019-01-30 16:07:48.300 ERROR 8424 --- [https-jsse-nio-8087-exec-3] org.apache.fop.apps.FOUserAgent          : Image not found. URI: https://localhost:4200/api/efront/secure/download/product/image/?fixedPrice=false&productId=2823&fileId=1756. (No context info available)

Кажется, что он вызывает URL, но он не получает реальное изображение от него.Может быть, какая-то проблема с заголовками изображений или FOUseragent блокируется?

1 Ответ

0 голосов
/ 30 января 2019

Что ж, реализовав всю возможную логику и увидев ваш код, я думаю, URIResolver поможет выйти из этого, как показано ниже:

Добавьте его в свой код: fopFactory.setURIResolver(new ResolveURIForWebServer());

import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;

public class ResolveURIForWebServer implements URIResolver {

@Override
public Source resolve(String href, String baseURI) throws TransformerException {
    Source source = null;
    try {
        // CONVERT IMAGE TO INPUTSTREAM
        source = new StreamSource(InputStream);

    } catch (Exception e) {

    } finally {

    }
    return source;
}
}

Надеюсь, это поможет.

...