2017-02-09 2 views
0

У меня проблема с печатью всех элементов моего ArrayList в pdf-файл с помощью PDFbox. Проблема в том, что файл pdf, сгенерированный программой, не содержит всех элементов ArrayList. Я не понимаю, почему это может быть потому, что все элементы ArrayList не помещаются на одной странице, но добавление страниц в pdf не решило проблему. Вот отрывок из моего кода:Получение моего arrraylist в pdf-файл с java

public PDPageContentStream gettextperpage(PDDocument document, PDPageContentStream contentStream, ArrayList<Component> In, int startind) { 
    int ht=740; 

    try { 
      contentStream.beginText(); 
      contentStream.setFont(font, 12); 
      contentStream.newLineAtOffset(60,ht); 

      int nbel=0; 

      if (startind/13==8) { 
       nbel=8; 
      } 
      else { 
       nbel=13; 
      } 
      System.out.println(nbel); 
      for(int i=0; i<nbel;i++) 
      { 
       int ind=startind+i; 
       Component cp=In.get(ind); 
       //contentStream.beginText(); 
       contentStream.showText(cp.toString()); 

       contentStream.newLineAtOffset(0,-LINE_HEIGHT-30); 

       //contentStream.endText(); 


      } 
      //contentStream.showText("Company:"+_asc +" "+_desc); 
      contentStream.endText(); 

      for (int i=0; i<13; i++) 
      { 
       PDImageXObject pdImage = PDImageXObject.createFromFile("4056182.jpg", document); 
       contentStream.drawImage(pdImage, 550, ht-40,40,40); 
       ht-=50; 
      } 

      contentStream.close(); 
     } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    return contentStream;  

} 
public void getoutputpdf(PDDocument document,ArrayList<Component> In) { 

    for (int k=0; k<9; k++) { 

     try { 


      System.out.println(k); 

      // Create a new blank page and add it to the document 
      PDPage Page = new PDPage(); 
      document.addPage(Page); 



      // Start a new content stream which will "hold" the to be created content 
      PDPageContentStream contentStream = new PDPageContentStream(document, Page); 
      contentStream=gettextperpage(document,contentStream,In,13*k); 
      // Define a text content stream using the selected font, moving the cursor and drawing the text "Hello World" 





      // Save the newly created document 
      document.save("testtot.pdf"); 

      // finally make sure that the document is properly 
      // closed. 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 
+5

Никогда, никогда, ** НИКОГДА ** не называйте 'ArrayList' как List ....' List' - это интерфейс, который реализует 'ArrayList', поэтому то, что вы по существу делаете, путает компилятор, себя и нас именования переменной 'List'. Пожалуйста, переименуйте 'ArrayList' в нечто более актуальное для функциональности кода ... – CraigR8806

+0

Спасибо. Переименовал ArrayList в comp_list, но это не решило проблему. –

+0

Я не говорил, что это решит вашу проблему. Вы пытались написать что-то произвольное в PDF? возможно, просто «Hello World» только для тестирования. Если это работает, ограничьте свой 'for-loop' только печатьми, возможно, 3-мя элементами. 'for (int i = 0; i <3; i ++)'. Это поможет вам определить, не работает ли она на странице или если ваш метод печати неверен – CraigR8806

ответ

0

Проблема была решена. Принимая во внимание все комментарии, я придумал решение распечатать содержимое ArrayList на многих страницах в формате pdf.

public void gettextperpage(PDDocument document, PDPageContentStream contentStream, ArrayList<Component> In, int startind) { 
    int ht=740; 
    int h=0; 
    try { 
      contentStream.beginText(); 
      contentStream.setFont(font, 12); 
      contentStream.newLineAtOffset(60,ht); 

      int nbel=0; 

      if (startind/13==8) { 
       nbel=8; 
       h=-280; 
      } 
      else { 
       nbel=13; 
       h=-10; 
      } 
      //System.out.println(nbel); 
      for(int i=0; i<nbel;i++) 
      { 
       int ind=startind+i; 
       Component cp=In.get(ind); 
       //contentStream.beginText(); 
       contentStream.showText(cp.toString()); 

       contentStream.newLineAtOffset(0,-LINE_HEIGHT-30); 

       //contentStream.endText(); 
      } 
      //contentStream.showText("Company:"+_asc +" "+_desc); 
      contentStream.newLineAtOffset(250,h); 
      contentStream.showText(Integer.toString((startind+13)/13)); 
      contentStream.endText(); 

      for (int i=0; i<nbel; i++) 
      { 
       int ind=startind+i; 
       Component cp=In.get(ind); 
       if (!cp.getimage().isEmpty()) { 
        String imagepath="photospieces/"+cp.getimage(); 
        PDImageXObject pdImage = PDImageXObject.createFromFile(imagepath, document); 
        contentStream.drawImage(pdImage, 550, ht-40,40,40); 

       } 
       ht-=50; 
      } 
      contentStream.close(); 
     } 
    catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
    return contentStream;  
} 

public void getoutputpdf(PDDocument document,ArrayList<Component> In) { 
    headerpage(document); 
    for (int k=0; k<9; k++) { 
     try { 
      //System.out.println(k); 

      // Create a new blank page and add it to the document 
      PDPage Page = new PDPage(); 
      document.addPage(Page); 

      // Start a new content stream which will "hold" the to be created content 
      PDPageContentStream contentStream = new PDPageContentStream(document, Page); 
      contentStream=gettextperpage(document,contentStream,In,13*k); 
      // Define a text content stream using the selected font, moving the cursor and drawing the text "Hello World" 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Функция gettextperpage записывает кусок архариста на одной странице pdf. Один из аргументов функции определяет, какой фрагмент arraylist будет записан на странице. Функция getoutputpdf применяет функцию gettextperpage для разных частей массива, чтобы создать несколько страниц PDF-файла.

Смежные вопросы