我正在尝试将在内存中创建的 PDF 从一个 API 发送到另一个 API,然后将其呈现在 HTML 页面中。关于我的技术的信息:
- 弹簧靴
- Microservices 架构(使用 Eureka)
- Java
- Thymeleaf
到目前为止,我所拥有的是一个微服务,它从输入字段(通过 API)接收字符串输入,然后我在这里得到它,我相信我在内存中准备了一个 pdf(尚未测试它):
public InputStream convert(String input) throws FileNotFoundException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(out);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
document.add(new Paragraph(input));
document.close();
return new ByteArrayInputStream(out.toByteArray());
}
这是我目前的发送控制器:
@RequestMapping("/cnv")
public InputStream doConversion(@RequestParam(defaultValue = "0") String input) {
try {
return textToPDFService.c2f(input);
} catch (FileNotFoundException e) {
throw new RuntimeException("Exception thrown while writing file: " + e);
}
}
我还没有为接收它的 Web 服务器显示任何代码,但是您可以期待,因为这是 Springboot,我将在 @Controller
中拥有一个相关的端点,以及一个与我的类型为 < 的微服务通信的方法w182>。
问题是,如何在 Web 服务器服务的 InputStream 中接收并呈现它?也欢迎有用的资源。
PS:在此之前我从未使用过 iText、Springboot 或 microservices。此外,从来没有关于 PDF 的要求(是的,我知道我是个大菜鸟)。
回答1
看来我得到了答案。确保在执行转换的控制器中返回 byte[]
甚至更好的 ResponseEntity<byte[]>
。然后,您应该像这样向您的请求添加标头:
return ResponseEntity.ok()
.header(headerKey, headerValue)
.contentType(MediaType.APPLICATION_PDF)
.body(res);
在您的接收微服务上,您需要一个服务来执行以下操作:
// Setup Headers & URL
String url = blah blah..;
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_PDF));
HttpEntity<String> entity = new HttpEntity<>("body", headers);
// Get Result from Microservice
return restTemplate.exchange(url, HttpMethod.GET, entity, byte[].class, input);
当然,这将返回给你这个ResponseEntity<byte[]>
。您可以将其传递给控制器端点,然后您就完成了:
return textToPDFService.textToPDFRequest(input);
请记住,您应该注意异常和 HTTP 代码,但这将作为一个最小的解决方案。