Html2pdf using open pdf (#11178)
* Added inital changes html to pdf using openPdf * Added changes to pdf for external style * Added chnages via flying saucer * Added changes ti fix the issue * Added inital changes * Simplyfied the core logic * Created a sperate package * Added changes for making it more modular * Added Image attribute update * Added chnages to add images * Added changes * Style validation * Added changes to fix the styles * Review comments updates * Corrected the versions * Fixed the review commit * Added changes to fix the indendation issue Co-authored-by: Amitabh.Tiwari <amitabh.tiwari@maersk.com>
This commit is contained in:
parent
b441c62f0e
commit
2a68c0e2bb
24
pdf/pom.xml
24
pdf/pom.xml
|
@ -71,6 +71,26 @@
|
||||||
<artifactId>flying-saucer-pdf</artifactId>
|
<artifactId>flying-saucer-pdf</artifactId>
|
||||||
<version>${flying-saucer-pdf.version}</version>
|
<version>${flying-saucer-pdf.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.xhtmlrenderer</groupId>
|
||||||
|
<artifactId>flying-saucer-pdf-openpdf</artifactId>
|
||||||
|
<version>${flying-saucer-pdf-openpdf.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jsoup</groupId>
|
||||||
|
<artifactId>jsoup</artifactId>
|
||||||
|
<version>${jsoup.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.openhtmltopdf</groupId>
|
||||||
|
<artifactId>openhtmltopdf-core</artifactId>
|
||||||
|
<version>${open-html-pdf-core.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.openhtmltopdf</groupId>
|
||||||
|
<artifactId>openhtmltopdf-pdfbox</artifactId>
|
||||||
|
<version>${open-html-pdfbox.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -93,6 +113,10 @@
|
||||||
<poi-ooxml.version>3.15</poi-ooxml.version>
|
<poi-ooxml.version>3.15</poi-ooxml.version>
|
||||||
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
|
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
|
||||||
<flying-saucer-pdf.version>9.1.20</flying-saucer-pdf.version>
|
<flying-saucer-pdf.version>9.1.20</flying-saucer-pdf.version>
|
||||||
|
<open-html-pdfbox.version>1.0.6</open-html-pdfbox.version>
|
||||||
|
<open-html-pdf-core.version>1.0.6</open-html-pdf-core.version>
|
||||||
|
<flying-saucer-pdf-openpdf.version>9.1.22</flying-saucer-pdf-openpdf.version>
|
||||||
|
<jsoup.version>1.14.2</jsoup.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,56 @@
|
||||||
|
package com.baeldung.pdf.openpdf;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.xhtmlrenderer.extend.FSImage;
|
||||||
|
import org.xhtmlrenderer.extend.ReplacedElement;
|
||||||
|
import org.xhtmlrenderer.extend.ReplacedElementFactory;
|
||||||
|
import org.xhtmlrenderer.extend.UserAgentCallback;
|
||||||
|
import org.xhtmlrenderer.layout.LayoutContext;
|
||||||
|
import org.xhtmlrenderer.pdf.ITextFSImage;
|
||||||
|
import org.xhtmlrenderer.pdf.ITextImageElement;
|
||||||
|
import org.xhtmlrenderer.render.BlockBox;
|
||||||
|
import org.xhtmlrenderer.simple.extend.FormSubmissionListener;
|
||||||
|
|
||||||
|
import com.lowagie.text.Image;
|
||||||
|
|
||||||
|
public class CustomElementFactoryImpl implements ReplacedElementFactory {
|
||||||
|
@Override
|
||||||
|
public ReplacedElement createReplacedElement(LayoutContext lc, BlockBox box, UserAgentCallback uac, int cssWidth, int cssHeight) {
|
||||||
|
Element e = box.getElement();
|
||||||
|
String nodeName = e.getNodeName();
|
||||||
|
if (nodeName.equals("img")) {
|
||||||
|
String imagePath = e.getAttribute("src");
|
||||||
|
try {
|
||||||
|
InputStream input = new FileInputStream("src/main/resources/" + imagePath);
|
||||||
|
byte[] bytes = IOUtils.toByteArray(input);
|
||||||
|
Image image = Image.getInstance(bytes);
|
||||||
|
FSImage fsImage = new ITextFSImage(image);
|
||||||
|
if (cssWidth != -1 || cssHeight != -1) {
|
||||||
|
fsImage.scale(cssWidth, cssHeight);
|
||||||
|
} else {
|
||||||
|
fsImage.scale(2000, 1000);
|
||||||
|
}
|
||||||
|
return new ITextImageElement(fsImage);
|
||||||
|
} catch (Exception e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove(Element e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFormSubmissionListener(FormSubmissionListener listener) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package com.baeldung.pdf.openpdf;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.xhtmlrenderer.layout.SharedContext;
|
||||||
|
import org.xhtmlrenderer.pdf.ITextRenderer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class Html2PdfUsingFlyingSaucer {
|
||||||
|
|
||||||
|
private static final String HTML_INPUT = "src/main/resources/htmlforopenpdf.html";
|
||||||
|
private static final String PDF_OUTPUT = "src/main/resources/html2pdf.pdf";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
Html2PdfUsingFlyingSaucer htmlToPdf = new Html2PdfUsingFlyingSaucer();
|
||||||
|
htmlToPdf.generateHtmlToPdf();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateHtmlToPdf() throws Exception {
|
||||||
|
File inputHTML = new File(HTML_INPUT);
|
||||||
|
Document inputHtml = createWellFormedHtml(inputHTML);
|
||||||
|
File outputPdf = new File(PDF_OUTPUT);
|
||||||
|
xhtmlToPdf(inputHtml, outputPdf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document createWellFormedHtml(File inputHTML) throws IOException {
|
||||||
|
Document document = Jsoup.parse(inputHTML, "UTF-8");
|
||||||
|
document.outputSettings()
|
||||||
|
.syntax(Document.OutputSettings.Syntax.xml);
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void xhtmlToPdf(Document xhtml, File outputPdf) throws Exception {
|
||||||
|
try (OutputStream outputStream = new FileOutputStream(outputPdf)) {
|
||||||
|
ITextRenderer renderer = new ITextRenderer();
|
||||||
|
SharedContext sharedContext = renderer.getSharedContext();
|
||||||
|
sharedContext.setPrint(true);
|
||||||
|
sharedContext.setInteractive(false);
|
||||||
|
sharedContext.setReplacedElementFactory(new CustomElementFactoryImpl());
|
||||||
|
renderer.setDocumentFromString(xhtml.html());
|
||||||
|
renderer.layout();
|
||||||
|
renderer.createPDF(outputStream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.baeldung.pdf.openpdf;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.file.FileSystems;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.helper.W3CDom;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
|
||||||
|
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
|
||||||
|
|
||||||
|
public class Html2PdfUsingOpenHtml {
|
||||||
|
|
||||||
|
private static final String HTML_INPUT = "src/main/resources/htmlforopenpdf.html";
|
||||||
|
private static final String PDF_OUTPUT = "src/main/resources/html2pdf.pdf";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
try {
|
||||||
|
Html2PdfUsingOpenHtml htmlToPdf = new Html2PdfUsingOpenHtml();
|
||||||
|
htmlToPdf.generateHtmlToPdf();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateHtmlToPdf() throws IOException {
|
||||||
|
File inputHTML = new File(HTML_INPUT);
|
||||||
|
Document doc = createWellFormedHtml(inputHTML);
|
||||||
|
xhtmlToPdf(doc, PDF_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Document createWellFormedHtml(File inputHTML) throws IOException {
|
||||||
|
Document document = Jsoup.parse(inputHTML, "UTF-8");
|
||||||
|
document.outputSettings()
|
||||||
|
.syntax(Document.OutputSettings.Syntax.xml);
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void xhtmlToPdf(Document doc, String outputPdf) throws IOException {
|
||||||
|
try (OutputStream os = new FileOutputStream(outputPdf)) {
|
||||||
|
String baseUri = FileSystems.getDefault()
|
||||||
|
.getPath("src/main/resources/")
|
||||||
|
.toUri()
|
||||||
|
.toString();
|
||||||
|
PdfRendererBuilder builder = new PdfRendererBuilder();
|
||||||
|
builder.withUri(outputPdf);
|
||||||
|
builder.toStream(os);
|
||||||
|
builder.withW3cDocument(new W3CDom().fromJsoup(doc), baseUri);
|
||||||
|
builder.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
|
@ -0,0 +1,26 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
.center_div {
|
||||||
|
border: 1px solid gray;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
width: 90%;
|
||||||
|
background-color: #d0f0f6;
|
||||||
|
text-align: left;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<link href="style.css" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="center_div">
|
||||||
|
<h1>Hello Baeldung!</h1>
|
||||||
|
<img src="Java_logo.png">
|
||||||
|
|
||||||
|
<div class="myclass">
|
||||||
|
<p>This is the tutorial to convert html to pdf.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,6 @@
|
||||||
|
.myclass{
|
||||||
|
font-family: Helvetica, sans-serif;
|
||||||
|
font-size:25;
|
||||||
|
font-weight: normal;
|
||||||
|
color: blue;
|
||||||
|
}
|
Loading…
Reference in New Issue