java - 如何在 jasper 报告中显示亚马逊 S3 图像

标签 java amazon-s3 jasper-reports

当我使用 jasper-reports 的本地镜像路径时,我可以将图像显示为 pdf,但我需要从亚马逊 S3 获取图像,如何通过 java 将亚马逊 S3 图像显示为 pdf?我应该先从 amazonS3 下载图像吗?或者链接 jasper 报告中的完整图像路径? 例如,我通过 jasper-reports 链接了本地镜像路径,如果我想从 amazonS3 获取图像,我该怎么做?请帮助我。

<imageExpression class="java.lang.String"><![CDATA["image_name.jpg"]]></imageExpression>

最佳答案

您可以使用 AWS Java SDK 生成 S3 图像对象的预签名 URL,并在 jasper-reports 中使用该预签名 URL。这样,您就不必从S3下载镜像了。请注意,预签名有一个到期时间,可以通过 java 设置。

下面是生成 S3 预签名 URL 的引用代码片段。

此链接中有更多详细信息。 https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html

public class GenerateS3SignedUrl implements BiFunction<String, String, String> {
    @Override
    @SneakyThrows
    public String apply(String bucketName, String objectKey) {
        String awsRegion = StringUtils.isEmpty(System.getenv(Constant.REGION)) ? Constant.DEFAULT_REGION :
                System.getenv(Constant.REGION);

        log.info("calculating expiration hrs defaults to 2 hrs");
        int expirationHrs;
        if (StringUtils.isEmpty(System.getenv(Constant.EXPIRATION_DURATION))) {
            expirationHrs = 2;
        } else if (!StringUtils.isNumeric(System.getenv(Constant.EXPIRATION_DURATION))) {
            expirationHrs = 2;
        } else {
            expirationHrs = Integer.parseInt(System.getenv(Constant.EXPIRATION_DURATION));
        }

        long expirationInMillis = 1000L * 60 * 60 * expirationHrs;
        log.info("create pre-signed url generate request..");
        GeneratePresignedUrlRequest generatePresignedUrlRequest =
                new GeneratePresignedUrlRequest(bucketName, objectKey)
                        .withMethod(HttpMethod.GET)
                        .withExpiration(Date.from(Instant.now().plusMillis(expirationInMillis)));

        log.info("generate pre-signed url..");
        URL preSignedUrl = AwsCommonConfig.getAmazonS3Client(awsRegion)
                .generatePresignedUrl(generatePresignedUrlRequest);

        log.info("return pre-signed url for file : {} with expiration in {} hrs.", objectKey, expirationHrs);
        return preSignedUrl.toString();
    }
}    
public class AwsCommonConfig {
    private static AmazonS3 amazonS3;

    public static AmazonS3 getAmazonS3Client (String awsRegion) {
        if (amazonS3 == null) {
            amazonS3 = AmazonS3ClientBuilder.standard()
                    .withRegion(awsRegion)
                    .withPathStyleAccessEnabled(true)
                    .build();
        }
        return amazonS3;
    }

}

关于java - 如何在 jasper 报告中显示亚马逊 S3 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71918755/

相关文章:

amazon-web-services - AWS CLI S3 调用 HeadObject 操作时发生客户端错误 (403) : Forbidden

amazon-web-services - S3 公共(public)只读文件但私有(private)目录

java - JasperReports 本地化

java - 如何在 Jasper Reports 中制作使用 Web 服务作为数据源的子报表

java - 比较Hadoop MapReduce中的两个文件

java - 替换已弃用的 org.apache.http.conn.scheme.SchemeRegistry、ThreadSafeClientConnManager 类等

java - Eclipse "quick type hierarchy"如图所示

file-upload - 使用 OS Open 将 Golang 文件上传到 s3

java - 显示对话框的软键盘

excel - iReport(JasperReports)额外行问题