Java 如何将可滚动的JPanel导出为pdf文件

Java 如何将可滚动的JPanel导出为pdf文件,java,swing,pdf,jpanel,itext,Java,Swing,Pdf,Jpanel,Itext,我已经设计了一个jpanel,它有很多具有滚动功能的swing组件。我想将整个Jpanle导出为pdf文件。但我无法导出整个Jpanle。 我使用itext生成pdf。 我的问题是我无法将整个jpanel导出为pdf。当我出口一半的Jpanel时 组件导出。但一半不导出。 这是我的密码 public void PrintFrameToPDF(JPanel c, File file) { try { Document d = new Document(

我已经设计了一个jpanel,它有很多具有滚动功能的swing组件。我想将整个Jpanle导出为pdf文件。但我无法导出整个Jpanle。 我使用itext生成pdf。 我的问题是我无法将整个jpanel导出为pdf。当我出口一半的Jpanel时 组件导出。但一半不导出。 这是我的密码

public void PrintFrameToPDF(JPanel c, File file) {
    try {           
        Document d = new Document();
        PdfWriter writer = PdfWriter.getInstance(d, new FileOutputStream("F://newfile.pdf"));
        d.open();

        PdfContentByte cb = writer.getDirectContent();
        PdfTemplate template = cb.createTemplate(800, 1600);
        Graphics2D g2d = template.createGraphics(800, 1600);
        // g2d.translate(1.0, 1.0);
        c.paintAll(g2d);
        // c.addNotify();
        // c.validate();
        g2d.dispose();
        cb.addTemplate(template, 0, 0);
        d.close();          
    } catch (Exception e) {
        //
    }
}
请帮帮我。 tnx

首先考虑从面板创建一个新的视图(通过将面板绘制为图像)。然后,您可以使用以下命令获取一个实例:

-
java.awt.Image
获取
com.itextpdf.textImage
的实例。图像以用户定义质量的JPEG格式添加

然后,可以使用方法或缩放图像(如下面的示例中所用)。可以找到有关使用图像(在iText中)的更多信息

下面的程序创建一个尺寸为2000x2000的面板,其中20x20(每个100px)的正方形绘制在面板上。面板包含在滚动窗格中。然后将其绘制到图像上,图像将缩放并添加到pdf文档并打印到pdf

下图仅显示如何将整个面板绘制到图像上,然后使用以前的面板图像创建另一个面板,以绘制到新面板上。然后通过对话框显示新面板

导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.image.buffereImage;
导入java.io.FileOutputStream;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.Image;
导入com.itextpdf.text.pdf.PdfWriter;
/**
*这个例子需要iText。我从Maven存储库中检索到了它
* 
*      
*com.itextpdf
*itextpdf
*          5.5.2
*      
*
*如果您注释掉整个文本,程序可以在没有iText的情况下运行
*方法printToPDF(和iText导入),以及在
*类构造函数。结果将显示在上图中。
*/
公共类大面板图像{
公共大型PanelToImageCve(){
LargeImagePanel=新的LargeImagePanel();
JFrame=新JFrame();
添加(新的JScrollPane(面板));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(JFrame.MAXIMIZED_二者);
frame.setVisible(true);
final java.awt.Image=getImageFromPanel(面板);
/*这只是一个文本面板,以确保完整的面板
*被吸引到小组中。
*/
JPanel newPanel=newjpanel(){
@凌驾
受保护组件(图形g){
超级组件(g);
g、 drawImage(图像,0,0,getWidth(),getHeight(),this);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(300300);
}
};
/*将图像打印为PDF格式*/
String fileName=“D://newfile.pdf”;
printToPDF(图像、文件名);
/*这只是一个测试,显示newPanel绘制了整个
*原始面板(缩放)
*/
showMessageDialog(null,newPanel);
}
public void printToPDF(java.awt.Image awtImage,字符串文件名){
试一试{
文件d=新文件();
PdfWriter writer=PdfWriter.getInstance(d,新文件输出流(
文件名);
d、 open();
Image iTextImage=Image.getInstance(writer,awtImage,1);
设置绝对位置(50,50);
iTextImage.scalePercent(25);
d、 添加(iTextImage);
d、 close();
}捕获(例外e){
e、 printStackTrace();
}   
}
public static java.awt.Image getImageFromPanel(组件){
BuffereImage=新的BuffereImage(component.getWidth(),
component.getHeight(),BufferedImage.TYPE_INT_RGB);
component.paint(image.getGraphics());
返回图像;
}
/**
*演示面板,2000x2000像素,带交替方块
*检查是否将所有正方形绘制到图像
*/
公共类LargeImagePanel扩展了JPanel{
专用静态最终整型全尺寸=2000;
每行每列专用静态最终整数=20;
私有静态最终整数平方大小=完整大小/每行每列;
受保护组件(图形g){
超级组件(g);
for(int row=0;row
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * This example requires iText. I retrieved it from Maven repository
 * 
 *      <dependency>
 *          <groupId>com.itextpdf</groupId>
 *          <artifactId>itextpdf</artifactId>
 *          <version>5.5.2</version>
 *      </dependency>
 *
 * The program can be run without iText if you comment out the entire
 * method printToPDF (and iText imports), along with it's method call in 
 * the class constructor. The result will be the the image above.
 */

public class LargePanelToImageMCVE {

    public LargePanelToImageMCVE() {
        LargeImagePanel panel = new LargeImagePanel();
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(panel));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);

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

        /* This was just a text panel to make sure the full panel was
         * drawn to the panel.
         */
        JPanel newPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };

        /* Print Image to PDF */
        String fileName = "D://newfile.pdf";
        printToPDF(image, fileName);

        /* This was just a test to show the newPanel drew the entire
         * original panel (scaled)
         */
        JOptionPane.showMessageDialog(null, newPanel);

    }

    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(50, 50);
            iTextImage.scalePercent(25);
            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;
    }

    /**
     * Demo panel that is 2000x2000 px with alternating squares
     * to check all squares are drawn to image
     */
    public class LargeImagePanel extends JPanel {
        private static final int FULL_SIZE = 2000;
        private static final int PER_ROW_COLUMN = 20;
        private static final int SQUARE_SIZE = FULL_SIZE / PER_ROW_COLUMN;

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            for (int row = 0; row < PER_ROW_COLUMN; row++) {
                for (int col = 0; col < PER_ROW_COLUMN; col++) {
                    if ((row % 2) == (col % 2)) {
                        g.setColor(Color.BLACK);
                    } else {
                        g.setColor(Color.WHITE);
                    }
                    g.fillRect(col * SQUARE_SIZE, row * SQUARE_SIZE,
                            SQUARE_SIZE, SQUARE_SIZE);
                }
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(FULL_SIZE, FULL_SIZE);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new LargePanelToImageMCVE();
            }
        });
    }
}