当前位置: 首页 > 知识库问答 >
问题:

XSL FO从服务器获取图像

顾正初
2023-03-14

我使用的是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

这响应于endpoint:

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 接受这两个不同的 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个答案

尚宏硕
2023-03-14

好吧,实现上述所有可能的逻辑并查看您的代码,我认为URIResolver将有助于解决以下问题:

将其添加到您的代码中:< code > fop factory . seturi resolver(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;
}
}

希望对您有所帮助。

 类似资料:
  • 我在我的屏幕上有四个图像视图,从相机中捕获图像并显示在其中,现在我想将这些图像上传到服务器上。因此,我使用了下面的代码来获取它们的路径,但它通过了异常。是否有可能从摄像机拍摄的图像视图将图像上传到服务器(无需将图像存储到内存中)。

  • 我们是否可以通过python客户端获得在Eureka服务器中注册的服务名称和IP? 我查看了python eureka客户端教程页面,但找不到与此相关的任何内容!

  • 问题内容: 我正在尝试获取远程服务器的证书,然后可以将其用于添加到我的密钥库中并在我的Java应用程序中使用。 一位资深开发人员(正在度假:()告诉我可以运行此程序: 为了获得原始证书,我可以将其复制并导出。我收到以下输出: 我也尝试过这个选项 和这个(在debian上运行) 但是得到同样的错误。 此消息源说我可以使用该CApath标志,但似乎无济于事。我尝试了多条路径都无济于事。 请让我知道我要

  • 问题内容: 我试图找到一种方法来获取显示在设置-> wi-fi->详细信息-> DNS下的DNS服务器IP。我不知道苹果是否允许以编程方式获取此信息。 问题答案: 我在OS X上使用了它并为我工作(也链接到ibresolv.dylib)

  • 我正在尝试从数据库中删除记录,以及从服务器中删除该记录的上载图像。我在控制器中有这个功能。 取消链接(C:\xampp\htdocs\larapro\public\newuploads\ 如果我使用 它显示: 解除关联(C: mpp\htdocs\larapro\Public\ewaddads{1470667358.png}):无效参数 我只是想知道为什么链接中的x和n丢失了。