Java – Merge file gives error: end-of-file, expected line

Merge file gives error: end-of-file, expected line… here is a solution to the problem.

Merge file gives error: end-of-file, expected line

I’m using PdfBox for android to append data to PDF files.

The data to append

public byte [] prerparePdfToAppend() {

final PDDocument document = new PDDocument();
    final PDPage sourcePage = new PDPage();
    document.addPage(sourcePage);

PDPageContentStream contentStream = new PDPageContentStream(document, sourcePage);
    contentStream.beginText();
    contentStream.setFont(PDType1Font.COURIER, 12);
    contentStream.showText("Name: " + firstName + " " + lastName);
    contentStream.newLine();
    ...
    contentStream.endText();
    contentStream.close();

output = new ByteArrayOutputStream();
    document.save(output);
    document.close();
    byte [] bytesToAppend = new byte[output.size()];
    output.write(bytes);
    output.close();

return bytesToAppend;
}

Merge code (simplified).

public void merge (String assetFileName) {
    byte [] toAppendPdf = prerparePdfToAppend();
    PDFMergerUtility mergerUtility = new PDFMergerUtility();
    mergerUtility.addSource(PDFBoxResourceLoader.getStream(assetFileName));
    mergerUtility.addSource(new ByteArrayInputStream(toAppendPdf));
    mergerUtility.setDestinationStream(destStream);
    mergerUtility.mergeDocuments(); IOException
}

Exceptions

java.io.IOException: Error: End-of-File, expected line
   at org.apache.pdfbox.pdfparser.BaseParser.readLine(BaseParser.java:1419)
   at org.apache.pdfbox.pdfparser.COSParser.parseHeader(COSParser.java:1648)
   at org.apache.pdfbox.pdfparser.COSParser.parsePDFHeader(COSParser.java:1627)
   at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:348)
   at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:888)
   at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:802)
   at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:172)

Solution

The last few lines of the prerparePdfToAppend method seem strange to me. But why complicate your life? Returns a PDDocument:

public PDDocument prerparePdfToAppend()
{
    final PDDocument document = new PDDocument();
    final PDPage sourcePage = new PDPage();
    document.addPage(sourcePage);

PDPageContentStream contentStream = new PDPageContentStream(document, sourcePage);
    contentStream.beginText();
    contentStream.setFont(PDType1Font.COURIER, 12);
    contentStream.showText("Name: " + firstName + " " + lastName);
    contentStream.newLine();
    ...
    contentStream.endText();
    contentStream.close();

return document;
}

Your merge code will look like this:

public void merge (String assetFileName)
{
    PDFMergerUtility mergerUtility = new PDFMergerUtility();
    PDDocument srcDoc = PDDocument.load(PDFBoxResourceLoader.getStream(assetFileName));
    PDDocument dstDoc = prerparePdfToAppend();
    mergerUtility.appendDocument(dstDoc, srcDoc);
    dstDoc.save(destStream);
    srcDoc.close();
    dstDoc.close();
}

If that doesn’t work – make sure

PDFBoxResourceLoader.getStream(assetFileName)

is a true PDF stream. If it still doesn’t work, explain which line of the new code produced the exception. Of course, make sure you are using the latest version of PDFBox.

Related Problems and Solutions