2017-10-19 4 views
0

Ich habe eine Liste mit Früchten, ich versuche, eine Frucht der Liste mit seinen Daten in eine JPanel zu setzen, indem ich eine for Schleife benutze. Ich möchte den Bildschirm mit JPanels von 4 mal 2 (insgesamt 8) auf einer Seite füllen. Sehen Sie das Ergebnis auf dem Bild unten.Wie man ein PDF von mehreren Seiten mit iText Java macht

Im Codebeispiel habe ich nicht die fruitslist verwendet, sondern stattdessen eine for-Schleife, die wie ich eine Liste von 11 Früchten >> für (int i = 0; i < 11; i ++) darstellt. Also, was ich jetzt erwartet, ist eine PDF-Datei mit 2 Seiten. Der erste enthält 8 Panels und der zweite 3 Panels. Ich frage mich, wie ich die Anwendung erstellen kann, um mehrere Seiten PDF zu erhalten, wo eine Seite nur maximal 8 Panels enthält. Jede Hilfe wäre willkommen.

// Der Code des JFrame //

import com.itextpdf.text.Document; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfTemplate; 
import com.itextpdf.text.pdf.PdfWriter; 
import java.awt.*; 
import java.io.FileOutputStream; 
import java.util.Date; 
import javax.swing.*; 

public class SmallList extends JFrame { 

GridLayout gridLayout = new GridLayout(0,4); 

public SmallList(String name) { 
    super(name); 
    setResizable(false); 
} 

public void addComponentsToPane(final Container pane) { 
    final JPanel components = new JPanel(); 
    components.setLayout(gridLayout); 

    for(int i = 0; i < 11; i++) { 
     JPanel jPanel = new javax.swing.JPanel(); 
     JSeparator seperator = new javax.swing.JSeparator(); 
     JSeparator separator1 = new javax.swing.JSeparator(); 
     JLabel nameLabel = new javax.swing.JLabel(); 
     JLabel unitLabel = new javax.swing.JLabel(); 
     JLabel priceLabel = new javax.swing.JLabel(); 
     JLabel centLabel = new javax.swing.JLabel(); 
     JLabel comma = new javax.swing.JLabel(); 
     jPanel.setBackground(new java.awt.Color(255, 255, 255)); 
     jPanel.setAlignmentX(0.0F); 
     jPanel.setAlignmentY(0.0F); 
     jPanel.setMaximumSize(null); 
     jPanel.setPreferredSize(new java.awt.Dimension(203, 289)); 

     seperator.setBackground(new java.awt.Color(0, 0, 0)); 

     separator1.setBackground(new java.awt.Color(0, 0, 0)); 

     nameLabel.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N 
     nameLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 

     unitLabel.setFont(new java.awt.Font("Tahoma", 0, 40)); // NOI18N 
     unitLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 

     priceLabel.setFont(new java.awt.Font("Tahoma", 0, 90)); // NOI18N 
     priceLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     priceLabel.setText(" "); 

     centLabel.setFont(new java.awt.Font("Tahoma", 0, 55)); // NOI18N 
     centLabel.setText(" "); 

     comma.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N 
     comma.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 
     comma.setText(","); 

     javax.swing.GroupLayout jPanelLayout = new javax.swing.GroupLayout(jPanel); 
     jPanel.setLayout(jPanelLayout); 
     jPanelLayout.setHorizontalGroup(
      jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(seperator) 
      .addComponent(separator1) 
      .addGroup(jPanelLayout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(unitLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
        .addComponent(nameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelLayout.createSequentialGroup() 
         .addComponent(priceLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addGroup(jPanelLayout.createSequentialGroup() 
           .addComponent(comma) 
           .addGap(0, 0, Short.MAX_VALUE)) 
          .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelLayout.createSequentialGroup() 
           .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
           .addComponent(centLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE))))) 
       .addContainerGap()) 
     ); 
     jPanelLayout.setVerticalGroup(
      jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(jPanelLayout.createSequentialGroup() 
       .addGap(6, 6, 6) 
       .addComponent(unitLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(seperator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(jPanelLayout.createSequentialGroup() 
         .addGap(32, 32, 32) 
         .addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
          .addComponent(priceLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(comma))) 
        .addGroup(jPanelLayout.createSequentialGroup() 
         .addGap(29, 29, 29) 
         .addComponent(centLabel))) 
       .addGap(32, 32, 32) 
       .addComponent(separator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(nameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap()) 
     ); 
     jPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

     components.add(jPanel); 
    } 

    pane.add(components); 
    print(); 
} 

private void print() { 
    Date date = new Date(); 
    try { 
     JFrame f = new JFrame("Productlijst klein"); 
     f.add(this.getComponent(0)); 
     f.setUndecorated(true); 
     f.pack(); 
     f.setVisible(true); 

     Document document = new Document(PageSize.A4.rotate()); 
     String fileName = "prijslijst" + date.getTime() + ".pdf"; 
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName)); 
     document.open(); 

     PdfContentByte cb = writer.getDirectContent(); 
     PdfTemplate template = cb.createTemplate(PageSize.A4.getHeight(), PageSize.A4.getWidth()); 
     Graphics2D g2d = template.createGraphics(f.getWidth(), f.getHeight()); 
     f.paintAll(g2d); 
     g2d.dispose(); 
     cb.addTemplate(template, 0, 0); 

     document.close();   

    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

/** 
* Create the GUI and show it. For thread safety, 
* this method is invoked from the 
* event dispatch thread. 
*/ 
private static void createAndShowGUI() { 
    //Create and set up the window. 
    SmallList frame = new SmallList("Fruit - kleine afmeting"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //Set up the content pane. 
    frame.addComponentsToPane(frame.getContentPane()); 
    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    /* Use an appropriate Look and Feel */ 
    try { 
     //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
     UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
    } catch (UnsupportedLookAndFeelException ex) { 
     ex.printStackTrace(); 
    } catch (IllegalAccessException ex) { 
     ex.printStackTrace(); 
    } catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } 
    /* Turn off metal's use of bold fonts */ 
    UIManager.put("swing.boldMetal", Boolean.FALSE); 

    //Schedule a job for the event dispatch thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 

}

Das Ergebnis wird so sein, wenn die Anwendung beendet ist. Eine Seite enthält 8 JPanels von Früchten. Result

+0

Bitte geben Sie ein minimales Beispiel, das zeigt, wo genau Sie versuchen, eine mehrseitige PDF zu erstellen. Der Großteil dieses Codes hat nichts mit Ihrer Frage zur PDF-Generierung zu tun. – Muto

+0

Sie verwenden eine Low-Level-Methode, um den Inhalt hinzuzufügen (wie in der Verwendung von 'ContentByte' zu ​​sehen), Sie müssen sich selbst um Seitenumbrüche kümmern. Wenn es hilft, können die Vorgänge, die Sie gerade ausführen, als Malen auf einer unendlich großen Leinwand angesehen werden, die Sie dann zu einer seitengroßen Leinwand hinzufügen (über 'cb.addTemplate()'). Du hast 11 Etiketten gezeichnet, du kannst die unteren 3 nicht sehen, da sie von der Seite gezeichnet wurden. –

+0

Danke für die Antworten, Muto schau dir die print() Methode an. Das Problem ist, dass ich nicht weiß, wie man ein mehrseitiges PDF erstellt. Genau darum bitte ich. – Hans

Antwort

2

Lösung

  • Statt pdf Grafiken verwenden, indem Sie die Tabelle in der PDF-Datei mit iText machen. Es ist immer eine gute Idee, das Modell (die zugrunde liegenden Daten) und Ihre grafische Darstellung (eine Benutzerschnittstelle oder ein PDF-Dokument) zu teilen, da dies Ihnen in Zukunft Flexibilität ermöglicht.

  • -Code für die Tabelle Beispiele (was wahrscheinlich ist, wie Sie Ihre PDF bauen müsste) an der iText Homepage zu finden Einfügen
    https://developers.itextpdf.com/content/itext-7-examples/itext-7-tables

  • Explizit ein Seitenumbruch bereits gestellt (und beantwortet hier)
    how can I make a page break using itext

Verwandte Themen