Search code examples
javapdf-generationpdfbox

creating pdf through pdfbox using inputstream


i am trying to add byte array to pdfbox box but unable to achieve it.. please find below the code

 import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import org.apache.pdfbox.Loader;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.PDPage;
    import org.apache.pdfbox.pdmodel.PDPageContentStream;
    import org.apache.pdfbox.pdmodel.font.PDType1Font;
    import org.apache.pdfbox.pdmodel.font.Standard14Fonts;
    
    public class App 
    {
    
    public static String getPDF(Blob l_bContent) throws IOException {
    
    InputStream stream = l_bContent.getBinaryStream();
        byte[] buffer = new byte[8192];
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int bytesRead;//enter code here
        while ((bytesRead = stream.read(buffer)) != -1) {
            baos.write(buffer, 0, bytesRead);
        }
        byte[] buffer1= baos.toByteArray();
        PDDocument doc = Loader.loadPDF(buffer1);
        PDPage page = new PDPage();
        
        doc.addPage(page);
        
        String fileName = "C:\\Users\\dhs\\new.pdf";
        doc.save(fileName);    
    
       stream.close();    
        
         return fileName;
        
    }

    public static void main( String[] args )
    {
       Blob l_bContent =managerservice.getblobcontent();
        App test1 = new App();
        try {
            test1.getPDF(l_bContent);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println( "Hello World!" );
    }
}

error

java.io.IOException: Error: End-of-File, expected line at offset 5 Hello World! at org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1092) at org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:1609) at org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1588) at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:157) at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:136) at org.apache.pdfbox.Loader.loadPDF(Loader.java:224) at org.apache.pdfbox.Loader.loadPDF(Loader.java:196) at org.apache.pdfbox.Loader.loadPDF(Loader.java:176) at org.apache.pdfbox.Loader.loadPDF(Loader.java:159) at pdftest.testpdf.App.getPDF(App.java:36) at pdftest.testpdf.App.main(App.java:85)


Solution

  • Since this is almost certainly down to the fact that your source data is almost certainly plain text, try the following (with thanks):

        public static void saveAsPdf(InputStream in, String outputPath) {
            try (PDDocument doc = new PDDocument()) {
                PDPage pdPage = new PDPage();
                doc.addPage(pdPage);
    
                try (PDPageContentStream contentStream = new PDPageContentStream(doc, pdPage);
                        Scanner s = new Scanner(in)) {
                    contentStream.beginText();
    
                    contentStream.setFont(PDType1Font.TIMES_ROMAN, 12);
                    contentStream.setLeading(14.5f);
                    contentStream.newLineAtOffset(25, 500);
    
                    while (s.hasNextLine()) {
                        contentStream.showText(s.nextLine());
                        contentStream.newLine();
                    }
    
                    contentStream.endText();
                }
    
                doc.save(outputPath);
            } catch (IOException e) {
                e.printStackTrace();    
            }
        }