2016-04-07 8 views
0

Ich habe diesen Code gefunden, der ein JPanel zu einem Bild überträgt und es dann in PDF-Datei druckt, aber da ich meine JPanel in einem JScrollPane und kein Layout oder Dimensionen enthält, weil es auf dem hängt JScrollPane-Layout, damit ich es nicht drucken kann. Der Fehler besagt, dass ein Bild mit der Höhe 0 und der Breite 0 nicht gedruckt werden kann. Wenn ich versuche, das JScrollPane selbst zu übergeben, bekomme ich nur den Rahmen des JScrollPane nur ohne den Inhalt JPanel gedruckt.Drucken JScrollPane Inhalt zu pdf

public void printToPDF(java.awt.Image awtImage, String fileName) { 
    try { 
     Document d = new Document(); 
     PdfWriter writer = PdfWriter.getInstance(d, new FileOutputStream(
       fileName)); 
     d.open(); 


     Image iTextImage = Image.getInstance(writer, awtImage, 1); 
     //iTextImage.setAbsolutePosition(100,300); 
     iTextImage.scalePercent(100); 
     d.add(iTextImage); 

     d.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static java.awt.Image getImageFromPanel(Component component) { 

    BufferedImage image = new BufferedImage(component.getWidth(), 
      component.getHeight(), BufferedImage.TYPE_INT_RGB); 
    component.paint(image.getGraphics()); 
    return image; 
} 

und hier ist die wichtigste Methode:

  JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 
    scrollPane.setBounds(0, 0, 600, 510); 
    scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
    getContentPane().add(scrollPane); 

    GridBagConstraints c = new GridBagConstraints(); 
    JPanel borderpanel = new JPanel(); 
    scrollPane.setViewportView(borderpanel); 

    Color veryLight = new Color(239,230,230); 
    JPanel container = new JPanel(); 
    borderpanel.add(container, BorderLayout.CENTER); 
    container.setLayout(new GridLayout(0,1,0,1)); 
    container.setBackground(Color.WHITE); 

    JPanel test = new JPanel(); 
    test.setLayout(new GridLayout(0,1,0,1)); 
    container.add(test, BorderLayout.CENTER); 

     JPanel rowPanel = new JPanel(); 
     rowPanel.setPreferredSize(new Dimension(580,50)); 
     test.add(rowPanel, BorderLayout.WEST); 
     rowPanel.setLayout(null); 

     JLabel auctionTitle = new JLabel("Auction Title"); 
     auctionTitle.setForeground(Color.WHITE); 
     auctionTitle.setFont(new Font("Tahoma", Font.PLAIN, 14)); 
     auctionTitle.setBounds(102, 0, 82, 20); 
     rowPanel.add(auctionTitle); 
     rowPanel.setBackground(SystemColor.GRAY); 

     JTextArea textArea = new JTextArea(); 
     textArea.setBackground(veryLight); 
     textArea.setBounds(191, 0, 386, 50); 
     rowPanel.add(textArea); 


     final java.awt.Image image = getImageFromPanel(borderpanel); 

     String fileName = "C:\\Users\\Test\\Desktop\\newfile.pdf"; 
     printToPDF(image, fileName); 

I borderpanel

+0

tun Sie alles eingestellt noch sichtbar? – gpasch

+0

Ich kann alles sehen, wenn ich es ausführen @gpasch – Hussein

+1

ja, aber ich sehe nichts dazwischen: rowPanel.add (textArea); abschließend java.awt.Image image = getImageFromPanel (borderpanel); Ist das borderPanel in dieser Umgebung sichtbar? egal wie du es am Ende siehst. Überprüfen Sie, wo die Dimensionen Null sind. – gpasch

Antwort

1

Verwenden java.awt.Robot bekommen das Bild der Platte drucken möchten:

public static java.awt.Image getImageFromPanel(Component component) { 

    Point p = new Point(0, 0); 
    SwingUtilities.convertPointToScreen(p, component); 

    int width = component.getSize().width; 
    int height = component.getSize().height; 
    Rectangle screenBounds = new Rectangle(p.x, p.y, width, height); 

    Robot robot = new Robot(); 
    BufferedImage image = robot.createScreenCapture(screenBounds); 

    component.getGraphics().drawImage(image, 0, 0, component); 

    return image; 
} 
+0

Mate Mein Problem nicht mit, wie man das Bild bekommen, weil ich Bild eines Etiketts zum Beispiel bekommen kann, wenn ich ein passiere Etikette. Das Problem ist mit der Höhe und Breite der Platte, die ich passiere. Da das Panel im Grid-Layout hängt und komplett von den Dimensionen der JScrollpane abhängt, übertrage ich also theoretisch beim Passieren des Panels die Komponente ohne Dimensionierung. Übrigens habe ich Ihren Code ausprobiert und bekomme den gleichen Fehler "Rechteckbreite und -höhe muss> 0 sein" – Hussein

+1

ich sehe. Möglicherweise erhalten Sie Größeninformationen aus dem Bildlaufbereich, um das Problem zu lösen. 'getImageFromPanel (Komponentenkomponente, int width, int height)'. Rufen Sie Methode wie folgt auf: 'getImageFromPanel (borderpanel, scrollPane.getWidth(), scrollPane.getHeight());' – rdonuk

+0

Es druckt einen schwarzen Block nur, weil das tatsächliche JPanel "borderpanel" keine Dimensionen hat. Können Sie mir bitte eine Möglichkeit geben, Dimensionen für dieses Panel zusammen mit der Verwendung von GridLayout festzulegen. – Hussein