Рубрики
Без рубрики

Создание PDF-файла на основе HTML-шаблона в Java Spring с использованием ItextPDF

Создание загружаемого / просматриваемого PDF-файла на основе чистого HTML-шаблона в Java Spring с использованием ITEXTPDF, JSOUP и Xhtmlrenderer. Помеченный itextpdf, jsoup, java, spring.

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 ResponseEntity getExport() {
        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”