当我使用 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/