Maven использовал
org.jsoup jsoup 1.12.1 org.xhtmlrenderer flying-saucer-pdf-itext5 9.0.1 com.itextpdf font-asian 7.1.7 test com.itextpdf itext-asian 5.2.0
Используемый Код
package id.com.hutchison.report.tools.controller; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfAction; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.itextpdf.text.pdf.PdfWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.xhtmlrenderer.pdf.ITextRenderer; /** * * @author TMPCSigit */ @Controller @RequestMapping("/api/v1/report") public class ReportController { private static final SimpleDateFormat filenameDate = new SimpleDateFormat("ddMMyyyyHHmmss"); private static final SimpleDateFormat readableDate = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); @RequestMapping(value = "/export", method = RequestMethod.GET, produces = MediaType.APPLICATION_PDF_VALUE) public ResponseEntitygetExport() { ITextRenderer renderer = new ITextRenderer(); ByteArrayOutputStream boas = null; try { String inputFile = "files/templates/autodebit.html"; String outputFile = "files/generated/autodebit_"+filenameDate.format(new Date())+".pdf"; String html = new String(Files.readAllBytes(Paths.get(inputFile))); final Document document = Jsoup.parse(html); document.outputSettings().syntax(Document.OutputSettings.Syntax.xml); document.body().select(".DOC_GENERATED_DATE").html(readableDate.format(new Date())); renderer.setDocumentFromString(document.html()); renderer.layout(); try (OutputStream os = Files.newOutputStream(Paths.get(outputFile))) { renderer.createPDF(os); os.close(); PdfReader reader = new PdfReader(outputFile); boas = new ByteArrayOutputStream(); PdfStamper stamper = new PdfStamper(reader, boas); stamper.setPageAction(PdfWriter.PAGE_OPEN, new PdfAction(PdfAction.PRINTDIALOG), 1); stamper.close(); } catch (DocumentException ex) { Logger.getLogger(ReportController.class.getName()).log(Level.SEVERE, null, ex); } } catch (IOException ex) { Logger.getLogger(ReportController.class.getName()).log(Level.SEVERE, null, ex); } HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_PDF); headers.setCacheControl("must-revalidate, post-check=0, pre-check=0"); ResponseEntity response = new ResponseEntity<>(boas.toByteArray(), headers, HttpStatus.OK); return response; } }
HTML-шаблон
Informasi Auto Debit Isi Ulang | ||||||||||
Auto Debit Recharge Information | generated at: {{DATE}} | |||||||||
Tanggal Pilihan | Nama Pelanggan | |||||||||
Invoice Data | Customer's Name | |||||||||
Nomor Tagihan | Alamat | |||||||||
Invoice Number | Address | |||||||||
Jumlah | Nomor HP | |||||||||
Amount | Mobile Number | |||||||||
Tanggal Tagihan | Nomor Tagihan | Jumlah | No. Category | Call Plan | Tgl Pembayaran | Tgl Input | Status | |||
Invoice Date | Invoice Number | Amount | Num Category | Call Plan | Payment Date | Upload Date | Status | |||
Previous Month | XXX | XXX | XXX | XXX | XXX | XXX | XXX | XXX | ||
This Month | XXX | XXX | XXX | XXX | XXX | XXX | XXX | XXX |
Оригинал: “https://dev.to/aswzen/creating-a-pdf-based-on-html-template-in-java-spring-using-itextpdf-42e5”