问题描述
我有一个关于合同管理的带有 React 和 SpringBoot 的网络应用程序。用户应该能够添加新合同,然后将合同下载为 PDF 文件,以便他可以签署,然后上传已签署的 contract.pdf。我做了上传和下载的部分,使用 java 中的 multipartfile,并将 pdf 存储在 MysqL 数据库中。
PDF 是在 SpringBoot 服务器中使用 Thymeleaf 从 HTML 文件创建的。我不清楚的是如何将 PDF 文件转换为 multipartfile,这样我就可以将其保存在数据库中。
而且我想将文件转换为 PDF 而不是将其保存在本地。 我使用了 iText HtmlConverter.convertToPdf(html,new FileOutputStream(name)); (com.itextpdf.html2pdf ),我不知道如何从中获取 PDF 文件...然后转换为 multipartfile。
这是我将数据从控制器传递到 HTML 文件然后将其转换为 PDF 的服务
@Service
public class PdfContentBuilder {
private TemplateEngine templateEngine;
@Autowired
public PdfContentBuilder(TemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
public String buildContract(Contract contract) {
Context context = new Context();
context.setvariable("data_contract",contract.getData());
context.setvariable("number",contract.getNumber());
return templateEngine.process("contract",context);
}
public void generatePdfFromHtml(String html,String name) throws IOException {
//here I would need to return a multipartfile
HtmlConverter.convertToPdf(html,new FileOutputStream(name));
}
}
public multipartfile createPDF(Contract contract){
contract.setNumber(25314);
Date myDate2 = new Date(System.currentTimeMillis());
contract.setData(myDate2);
String htmlString = pdfContentBuilder.buildContractTerti(contract);
try {
//here I don't kNow how to take the PDF as file and not save it local
pdfContentBuilder.generatePdfFromHtml(htmlString,"filename-contract.pdf");
return pdfmultipartfile;
} catch (Exception e) {
e.printstacktrace();
return pdfmultipartfile;
}
}
我搜索了 HtmlConverter.convertToPdf 但没有一个版本返回文件,所有版本都返回无效。 如果有人可以帮忙,请?
解决方法
首先将pdf写入字节数组,然后存储在文件中并创建响应:
public byte[] generatePdfFromHtml(String html,String name) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
HtmlConverter.convertToPdf(html,buffer);
byte[] pdfAsBytes = buffer.toByteArray();
try (FileOutputStream fos = new FileOutputStream(name)) {
fos.write(pdfAsBytes);
}
return pdfAsBytes.
}
下载使用 HttpEntity 而不是 MultipartFile,例如
HttpHeaders header = new HttpHeaders();
header.setContentType(MediaType.APPLICATION_PDF);
header.set(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename=" + fileName.replace(" ","_"));
header.setContentLength(documentBody.length);
HttpEntity pdfEntity = new HttpEntity<byte[]>(pdfAsBytes,header);