You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@pdfbox.apache.org by Leon Tian <le...@hotmail.com> on 2017/06/07 20:18:52 UTC

Issues with Requested page with index 1728 was not written before.

Hi

I met below exception when trying to generate PDF files. I use the BatangChe TrueTypeFont to generate PDF for Korean language. I have a batch of 100 files to process and it usually starts to giving this error towards the end.

[err] java.io.IOException: Requested page with index 1728 was not written before.
[err]     at org.apache.pdfbox.io.ScratchFile.readPage(ScratchFile.java:303)
[err]     at org.apache.pdfbox.io.ScratchFileBuffer.read(ScratchFileBuffer.java:460)
[err]     at java.io.InputStream.read(Unknown Source)
[err]     at org.apache.pdfbox.filter.FlateFilter.decompress(FlateFilter.java:133)
[err]     at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:73)
[err]     at org.apache.pdfbox.cos.COSInputStream.create(COSInputStream.java:69)
[err]     at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:162)
[err]     at org.apache.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:235)
[err]     at org.apache.pdfbox.pdmodel.common.PDStream.toByteArray(PDStream.java:499)
[err]     at org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.buildFontFile2(TrueTypeEmbedder.java:104)
[err]     at org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.subset(TrueTypeEmbedder.java:331)
[err]     at org.apache.pdfbox.pdmodel.font.PDType0Font.subset(PDType0Font.java:162)
[err]     at com.ibm.esh.bluemix.iol.pdf.PDFCreator.createPDF(IOLPDFCreator.java:227)


Here's the code that I use

    public byte[] createPDF(String[] text) throws IOLPDFException{
        byte[] pdfBytes = null;
        PDDocument sourceDoc = null;

        try {
            // get the source PDF template page
            sourceDoc = PDDocument.load(IOLPDFCreator.class.getResourceAsStream(sourcePath));
            PDPage templatePage = sourceDoc.getPage(0);

            // instantiate the target pdf file, if it has not been instantiated
            if (targetDoc == null) {
                targetDoc = new PDDocument();
            }

            if (font == null) {
                loadFont(targetDoc);
            }

            PDPageContentStream contents = null;

            int pageNum = 0;
            int rowNum = 0;

            for (int i=0; i< text.length; i++) {

                // Create a Pattern object based on regex for top page line
                Pattern rLine = Pattern.compile("PAGE : 0\\d\\d\\d");
                // Create matcher object.
                Matcher mLine = rLine.matcher(text[i]);

                //if page top line is found, initialize a new page
                if (mLine.find())  {
                    //if not the first page, close the previous page content stream
                    if (contents!=null) {
                        contents.close();
                    }
                    //get a blank template page imported
                    targetDoc.importPage(templatePage);
                    PDPage page = targetDoc.getPage(pageNum);
                    contents = new PDPageContentStream(targetDoc, page, AppendMode.APPEND, true, true);
                    rowNum = 0;
                    pageNum ++;
                    continue;
                }

                // write the text line onto the page
                contents.beginText();
                contents.setFont(font, size);
                contents.newLineAtOffset(x, y - rowNum*space);
                contents.showText(text[i]);
                contents.endText();
                rowNum++;
            }

            //close the last page content stream
            contents.close();

            //save the document and get the bytes
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            targetDoc.save(out);
            pdfBytes = out.toByteArray();

            return pdfBytes;

        } catch (IOException ie){
            System.out.println("IOException while creating pdf...");
            ie.printStackTrace();
            throw new PDFException("IOL createPDF encountered IOexception...");
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new PDFException("IOL createPDF encountered exception...");
        } finally {
            //close both targetDoc and sourceDoc
            try {
                if (targetDoc != null) {
                    targetDoc.close();
                }
                if (sourceDoc != null) {
                    sourceDoc.close();
                }
            } catch (IOException ie){
                System.out.println("IOException while closing document...");
                ie.printStackTrace();
                throw new PDFException("IOL createPDF encountered IOexception...");
            }
        }

    }


Your help is appreciated!

<http://aka.ms/weboutlook>

Re: Issues with Requested page with index 1728 was not written before.

Posted by Tilman Hausherr <TH...@t-online.de>.
Hi,

Difficult to tell because it isn't the full code.
After closing targetDoc you didn't assign null to it, so it will be 
reused here:

             // instantiate the target pdf file, if it has not been 
instantiated
             if (targetDoc == null) {
                 targetDoc = new PDDocument();
             }

Similar problem with font. You cannot use the same PDFont with several 
documents.

If this doesn't help, please reduce your code to a Short, Self 
Contained, Correct, Example:
http://sscce.org/
https://stackoverflow.com/help/mcve .

Tilman


Am 07.06.2017 um 22:18 schrieb Leon Tian:
> Hi
>
> I met below exception when trying to generate PDF files. I use the BatangChe TrueTypeFont to generate PDF for Korean language. I have a batch of 100 files to process and it usually starts to giving this error towards the end.
>
> [err] java.io.IOException: Requested page with index 1728 was not written before.
> [err]     at org.apache.pdfbox.io.ScratchFile.readPage(ScratchFile.java:303)
> [err]     at org.apache.pdfbox.io.ScratchFileBuffer.read(ScratchFileBuffer.java:460)
> [err]     at java.io.InputStream.read(Unknown Source)
> [err]     at org.apache.pdfbox.filter.FlateFilter.decompress(FlateFilter.java:133)
> [err]     at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:73)
> [err]     at org.apache.pdfbox.cos.COSInputStream.create(COSInputStream.java:69)
> [err]     at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:162)
> [err]     at org.apache.pdfbox.pdmodel.common.PDStream.createInputStream(PDStream.java:235)
> [err]     at org.apache.pdfbox.pdmodel.common.PDStream.toByteArray(PDStream.java:499)
> [err]     at org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.buildFontFile2(TrueTypeEmbedder.java:104)
> [err]     at org.apache.pdfbox.pdmodel.font.TrueTypeEmbedder.subset(TrueTypeEmbedder.java:331)
> [err]     at org.apache.pdfbox.pdmodel.font.PDType0Font.subset(PDType0Font.java:162)
> [err]     at com.ibm.esh.bluemix.iol.pdf.PDFCreator.createPDF(IOLPDFCreator.java:227)
>
>
> Here's the code that I use
>
>      public byte[] createPDF(String[] text) throws IOLPDFException{
>          byte[] pdfBytes = null;
>          PDDocument sourceDoc = null;
>
>          try {
>              // get the source PDF template page
>              sourceDoc = PDDocument.load(IOLPDFCreator.class.getResourceAsStream(sourcePath));
>              PDPage templatePage = sourceDoc.getPage(0);
>
>              // instantiate the target pdf file, if it has not been instantiated
>              if (targetDoc == null) {
>                  targetDoc = new PDDocument();
>              }
>
>              if (font == null) {
>                  loadFont(targetDoc);
>              }
>
>              PDPageContentStream contents = null;
>
>              int pageNum = 0;
>              int rowNum = 0;
>
>              for (int i=0; i< text.length; i++) {
>
>                  // Create a Pattern object based on regex for top page line
>                  Pattern rLine = Pattern.compile("PAGE : 0\\d\\d\\d");
>                  // Create matcher object.
>                  Matcher mLine = rLine.matcher(text[i]);
>
>                  //if page top line is found, initialize a new page
>                  if (mLine.find())  {
>                      //if not the first page, close the previous page content stream
>                      if (contents!=null) {
>                          contents.close();
>                      }
>                      //get a blank template page imported
>                      targetDoc.importPage(templatePage);
>                      PDPage page = targetDoc.getPage(pageNum);
>                      contents = new PDPageContentStream(targetDoc, page, AppendMode.APPEND, true, true);
>                      rowNum = 0;
>                      pageNum ++;
>                      continue;
>                  }
>
>                  // write the text line onto the page
>                  contents.beginText();
>                  contents.setFont(font, size);
>                  contents.newLineAtOffset(x, y - rowNum*space);
>                  contents.showText(text[i]);
>                  contents.endText();
>                  rowNum++;
>              }
>
>              //close the last page content stream
>              contents.close();
>
>              //save the document and get the bytes
>              ByteArrayOutputStream out = new ByteArrayOutputStream();
>              targetDoc.save(out);
>              pdfBytes = out.toByteArray();
>
>              return pdfBytes;
>
>          } catch (IOException ie){
>              System.out.println("IOException while creating pdf...");
>              ie.printStackTrace();
>              throw new PDFException("IOL createPDF encountered IOexception...");
>          } catch (Exception ex) {
>              ex.printStackTrace();
>              throw new PDFException("IOL createPDF encountered exception...");
>          } finally {
>              //close both targetDoc and sourceDoc
>              try {
>                  if (targetDoc != null) {
>                      targetDoc.close();
>                  }
>                  if (sourceDoc != null) {
>                      sourceDoc.close();
>                  }
>              } catch (IOException ie){
>                  System.out.println("IOException while closing document...");
>                  ie.printStackTrace();
>                  throw new PDFException("IOL createPDF encountered IOexception...");
>              }
>          }
>
>      }
>
>
> Your help is appreciated!
>
> <http://aka.ms/weboutlook>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org