2024-05-14

iText write to outputstream




You should change the declaration of out to be of type ByteArrayOutputStream rather than just OutputStream. Then you can call ByteArrayOutputStream.toByteArray() to get the bytes, and construct a ByteArrayInputStream wrapping that.

As an aside, I wouldn't catch Exception like that, and I'd use a try-with-resources statement to close the document, assuming it implements AutoCloseable. It's also a good idea to follow Java naming conventions. So for example, you might have:

public InputStream createPdf() throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();            
    try (Document doc = new Document(PageSize.A4, 50, 50, 50, 50)) {
        PdfWriter writer = PdfWriter.getInstance(doc, out);
        doc.open();
        PdfPTable table = new PdfPTable(1);
        PdfPCell cell = new PdfPCell(new Phrase("First PDF"));
        cell.setBorder(Rectangle.NO_BORDER);
        cell.setRunDirection(PdfWriter.RUN_DIRECTION_LTR);
        table.addCell(cell);
        doc.add(table);
    }
    return new ByteArrayInputStream(out.toByteArray());
}






-----------------------------


/**
 * 
 */
package test.com.report.daily;

import static org.junit.jupiter.api.Assertions.*;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Text;



/**
 * @author Billson C
 *
 */
class TestByteArrayOf_iTextPdfToFile
{
private static final Logger _LOG = LoggerFactory.getLogger(TestByteArrayOf_iTextPdfToFile.class);

String pathRoot = "C:\\samples\\";

@BeforeAll
static void setUpBeforeClass() throws Exception {
}

@AfterEach
void tearDown() throws Exception {
}

String pathSeperator = "/";
DateFormat _DTF = new SimpleDateFormat("HHmm");

@Test
void test() throws IOException {

String currentPathFolder = null;
String currentPathFile = null;
String currentTimingGenerated = _DTF.format(Calendar.getInstance().getTime());

currentPathFolder = StringUtils.join(pathRoot, pathSeperator, currentTimingGenerated, pathSeperator
// , currentPortLocationCode
);

Files.createDirectories(Paths.get(currentPathFolder));

String dash = "-";

String filename = StringUtils.join("bytearray-of-itext-pdf-to-file", ".", "pdf");

String content = StringUtils.join("The filename of this file is: ", filename);

currentPathFile = StringUtils.join(currentPathFolder, pathSeperator, filename);

File fPdf = new File(currentPathFile);

try (FileOutputStream fosPdf = new FileOutputStream(fPdf);) {

byte[] aryByte = _getAryByteOfPdf(content);

fosPdf.write(aryByte);

// outputStream.writeTo(fosPdf);

} catch (Exception e) {
_LOG.error("Error while test|{}", e.getMessage(), e);
}

assertTrue(fPdf.exists());
// TO DO: suppose to check file content equal to filename

String contentFromPdf = PdfTextExtractor.getTextFromPage(new PdfDocument(new PdfReader(fPdf)).getFirstPage());

_LOG.debug("contentFromPdf|{}", contentFromPdf);

assertEquals(content, contentFromPdf);

}

/**
* @param content
*/
protected byte[] _getAryByteOfPdf(String content) {
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfWriter pdfWriter = new PdfWriter(outputStream);
// PdfWriter pdfWriter = new PdfWriter(currentPathFile);
Document document = new Document(new PdfDocument(pdfWriter
// new PdfWriter("./hello-pdf.pdf")
), PageSize.A4.rotate())) {

document.add(new Paragraph(new Text(content)));
document.close();

return outputStream.toByteArray();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

}