How to convert itextpdf documents to byte arrays
I need to convert the itextpdf document file into byte [] I have tested that I did not create PDF correctly The problem is how to convert it into a byte array for storage in dB
This is my code:
Document generatedDocument = reportService.generateRequestForm(scdUser,jsonObject,null); reportService.generateRequestForm(scdUser,null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter pdfWriter = PdfWriter.getInstance(generatedDocument,baos); generatedDocument.open(); document.setDocument(baos.toByteArray()); // stores as blob
I get a null value in the blob column of the database
This is my document domain object:
Document domain object
@Entity @Table(name = "document") public class Document implements java.io.Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "document_id",nullable = false) private int documentId; @Column(name = "document_name",nullable = false,length = 65535) private String documentName; @Column(name = "document_type",nullable = false) private int documentType; @Temporal(TemporalType.TIMESTAMP) @Column(name = "upload_date",length = 19) private Date uploadDate = new Date(); @Column(name = "document",nullable = false) private byte[] document; // BLOB COLUMN @Column(name = "document_size",nullable = false) private long documentSize; @Column(name = "title",nullable = true,insertable = true,updatable = true,length = 65535,precision = 0) private String title; @Column(name = "tag",precision = 0) private String tag; @Column(name = "description",precision = 0) private String description; @Column(name = "shared",length = 1,precision = 0) private boolean shared = false; @Column(name = "status",nullable = false) private int status = DocumentStatus.READY.getStatus(); public int getDocumentId() { return this.documentId; } public void setDocumentId(int documentId) { this.documentId = documentId; } public String getDocumentName() { return this.documentName; } public void setDocumentName(String documentName) { this.documentName = documentName; } public int getDocumentType() { return this.documentType; } public void setDocumentType(int documentType) { this.documentType = documentType; } public Date getUploadDate() { return this.uploadDate; } public void setUploadDate(Date uploadDate) { this.uploadDate = uploadDate; } public byte[] getDocument() { return this.document; } public void setDocument(byte[] document) { this.document = document; } public long getDocumentSize() { return this.documentSize; } public void setDocumentSize(long documentSize) { this.documentSize = documentSize; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public boolean getShared() { return shared; } public void setShared(boolean shared) { this.shared = shared; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } }
Solution
I have a similar problem... I created document and in the class I created it, I can save it to file, and it works well However, when I try to return it as a stream, I get a null value
The problem is that once the document is closed (document. Close ()), it also closes the stream
The solution is to create bytearrayoutputstream when creating document and pdfwriter output Then I can use PDF bytes to do whatever I want... In my case, I convert them to streamedcontent to send to users
Create a variable to hold bytes:
private ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Let pdfwriter output data to byte []:
Document document = new Document(PageSize.LETTER,0.75F,0.75F); PdfWriter.getInstance(document,byteArrayOutputStream); // Do this BEFORE document.open() document.open(); createPDF(document); // Whatever function that you use to create your PDF document.close();
When you're done generating a PDF, just get the bytes and process them as you wish
byte[] pdfBytes = byteArrayOutputStream.toByteArray();
I don't know what your reportservice class is like, but this may be a good place to put it
I hope this will help