javapdfxhtmlxhtmlrenderer

XHMTL rendered produces an empty pdf file


I'm using ITextRenderer() method to convert an xhtml code to pdf in java.

This is my code:

ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(XHTML.toString());

renderer.layout();
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
    renderer.createPDF(baos);
} catch (DocumentException e) {
    baos.close();
    setErrorMessage(response, 500, "Internal Server Error", "Could not create the PDF version of the patient summary.");
    return;
} 

 //convert PDF to base64
 String base64PDF = Base64.encodeBytes(baos.toByteArray());
 baos.close();  

My XMTML.toString() contains the following:

 <html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<style>
*{
  font-family: Arial;
}
table {
    width:100%;
}
table, th, td {
    border: 1px solid black;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
    text-align: left;
}
table th    {
    background-color: #77f;
    color: white;
}


</style>
</head>
<body><h1>Patient Summary</h1><hr></hr><table><thead><tr><th colspan="2">Demographics</th></tr></thead><tbody><tr><td>Full Name</td><td>George Georgiou</td></tr><tr><td>Date of 
Birth</td><td>1990-01-01</td></tr><tr><td>Gender</td><td>Male</td></tr><tr><td>Address</td><td>31 Agiou Marona, 1010, Lefkosia, 
CY</td></tr></tbody></table><h3>Allergies</h3><table><thead><tr><th>Reaction Type</th><th>Clinical Manifestation</th><th>Agent</th><th>Onset Date</th></tr></thead><tbody><tr 
ID="allergy.1"><td ID="allergy.1.type">Panadol</td><td ID="allergy.1.manifestation">Dyspnoea</td><td ID="allergy.1.agent">Penicillamine and similar agents</td><td 
ID="allergy.1.onset">2017-07-04</td></tr></tbody></table>

Unfortunately, the created pdf file is empty. When I use the XHMTL code to an online converted to convert it to a pdf files, it's converted successfully.

Can you help me? Thank you in advance!


Solution

  • I found the solution.

    My xhtml file should contain <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> and also a <title> section.

    My complete xhtml file is the following:

    <!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "DTD/xhtml1-strict.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
    <title>Patient Summary PDF</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
    {
      font-family: Arial;
    }
    table {
        width:100%;
    }
    table, th, td {
        border: 1px solid black;
        border-collapse: collapse;
    }
    th, td {
        padding: 5px;
        text-align: left;
    }
    table th    {
        background-color: #77f;
        color: white;
    }
    </style>
    </head>
    <body><h1>Patient Summary</h1><table><thead><tr><th colspan="2">Demographics</th></tr></thead><tbody><tr><td>Full Name</td><td>George Georgiou</td></tr><tr><td>Date of Birth</td><td>1990-01-01</td></tr><tr><td>Gender</td><td>Male</td></tr><tr><td>Address</td><td>31 Agiou Marona, 1010, Lefkosia, CY</td></tr></tbody></table><h3>Allergies</h3><table><thead><tr><th>Reaction Type</th><th>Clinical Manifestation</th><th>Agent</th><th>Onset Date</th></tr></thead><tbody><tr ID="allergy.1"><td ID="allergy.1.type">Panadol</td><td ID="allergy.1.manifestation">Dyspnoea</td><td ID="allergy.1.agent">Penicillamine and similar agents</td><td ID="allergy.1.onset">2017-07-04</td></tr></tbody></table></body></html>
    

    I had to add three extra jar files: (a) core-renderer.jar, (b) core-renderer-minimal.jar and (c) xml-apis-xerces-2.9.1.jar.

    It's important to mention all these work only with iText-2.0.8.jar file.

    Also I had to import import com.lowagie.text.DocumentException; and import org.xhtmlrenderer.pdf.ITextRenderer;