1

私はレポートアプリケーションに取り組んでおり、JTableのカスタマイズに基づいてPDFにいくつかのカスタマイズを書き込む必要があります。

私が使用しているもの:-iText 5.3.3.jar java jdk 1.6

ここでは、セルをフォーマットして、下線と取り消し線の値を印刷します。私はこれをcellrendererでコーディングします。

これらの値をPDFに出力するには、PDFにJTableを直接記述します。しかし、出力として、下線/取り消し線は表示されませんでした。

JTable画像出力

JTable pdf

取り消し線と下線が画像に表示されるため。PDFには表示されません。

以下はそれをテストするためのサンプルコードです:-

**

  • TableImage.java

**

package com.swing.data;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;

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;



class TableImage {

    public static void main(String[] args) throws Exception {
        Object[][] data = {
            {"Hari", new Integer(23), new Double(78.23), (true)},
            {"James", new Integer(23), new Double(47.64), (false)},
            {"Sally", new Integer(22), new Double(84.81), (true)}
        };
        String[] columns = {"Name", "Age", "GPA", "Pass"};
        JTable table = new JTable(data, columns);
        JScrollPane scroll = new JScrollPane(table);
        JPanel p = new JPanel(new BorderLayout());
        p.add(scroll, BorderLayout.CENTER);
        JOptionPane.showMessageDialog(null, p);
        JTableHeader h = table.getTableHeader();
        int x = table.getWidth();
        int y = table.getHeight();
        table.setIntercellSpacing(new Dimension(0,0));
        table.setDefaultRenderer(Object.class, new ColumnAlignmentRenderer(table.getDefaultRenderer(Object.class)));
        BufferedImage bi = new BufferedImage(
                x, y, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.createGraphics();
        Graphics2D g2 = (Graphics2D) g;
        table.paint(g2);
        JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi)));
        print(table);
    }
    private static void print(JTable table) {
        Document document = new Document(PageSize.A4.rotate());
        try { 
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("F://jTable.pdf")); 

            document.open(); 
            PdfContentByte cb = writer.getDirectContent(); 

            cb.saveState();

            PdfTemplate pdfTemplate = cb.createTemplate(table.getWidth(), table.getHeight());
            Graphics2D g2 = pdfTemplate.createGraphics(table.getWidth(), table.getHeight());

            table.print(g2);
            cb.addTemplate(pdfTemplate, 20, 100);
            g2.dispose();
            cb.restoreState();
            } catch (Exception e) { 
            System.err.println(e.getMessage()); 
            } 

        document.close();

      }


    private TableImage() {
    }
}

**

  • ColumnAlignmentRenderer

**

package com.swing.data;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.font.TextAttribute;
import java.util.HashMap;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class ColumnAlignmentRenderer extends DefaultTableCellRenderer {

    private TableCellRenderer mWrappedRenderer;
    private HashMap objFormatCellMap;

    public ColumnAlignmentRenderer(TableCellRenderer pWrappedRenderer) {
        mWrappedRenderer = pWrappedRenderer;
    }

    public Component getTableCellRendererComponent(JTable pTable,
            Object pValue, boolean pIsSelected, boolean pHasFocus, int pRow,
            int pColumn) {
        int hAlignment = SwingConstants.LEFT;
        int vAlignment = SwingConstants.CENTER;
        String pattern = "##000.0";
        Font font = pTable.getFont();
        Border cellBorder = pTable.getBorder();
        Map fontAttributes = font.getAttributes();
        fontAttributes.put(TextAttribute.STRIKETHROUGH,TextAttribute.STRIKETHROUGH_ON);
        fontAttributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
        font = font.deriveFont(fontAttributes);
        // Border cellBorder = BorderFactory.createCompoundBorder();
        Color backgroundColor = Color.WHITE;
        Color foregroundColor = Color.BLACK;
        // Use the wrapped renderer
        Component renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected,
                        pHasFocus, pRow, pColumn);

        int iLeft = 1;
        int iRight = 1;
        int iTop = 1;
        int iBottom = 1;

        if (pRow == 0) {
            ((JLabel) renderedComponent).setFont(font);
        }
        if (pIsSelected) {
            renderedComponent.setBackground(pTable.getSelectionBackground());
        }
        return renderedComponent;
    }

    public void setHashFormatCellData(HashMap hashFormatCellData) {
        this.objFormatCellMap = hashFormatCellData;
    }

}

**

  • 更新1:-

**すべてのリンクは本当に役に立ちます!しかし、私は以下のコードでJOPtionPaneで正しい画像を取得しました:-

    BufferedImage bi = new BufferedImage(
            x, y, BufferedImage.TYPE_INT_RGB);
    Graphics g = bi.createGraphics();
    Graphics2D g2 = (Graphics2D) g;
    table.paint(g2);
    JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bi)));

上記のコードテーブルの画像には、取り消し線と下線付きのセルが含まれています。ただし、PDF出力になるコードを使用すると、取り消し線や下線なしでセルの内容が表示されます。

 PdfContentByte cb = writer.getDirectContent(); 
            cb.saveState();
            table.addNotify();
            table.doLayout();
            PdfTemplate pdfTemplate = cb.createTemplate(table.getWidth(), table.getHeight());
            Graphics2D g2 = pdfTemplate.createGraphics(table.getWidth(), table.getHeight());
            table.printAll(g2);
            cb.addTemplate(pdfTemplate, 20, 100);
            g2.dispose();
            cb.restoreState();

上記をご覧になり、何か提案してください。

4

1 に答える 1

2

repaint() (API で実装) に必要なコンテナまたは JComponents からの最初のイベントで有効期限が切れるスナップショットを作成するため、3. コード行に続いて削除します。

Graphics g = bi.createGraphics();
Graphics2D g2 = (Graphics2D) g;
table.paint(g2);

印刷のチュートリアルl 特にSwing コンポーネントでの印刷のサポート を参照してください。チュートリアルには、実行可能なコード例が含まれています。

@Andrew ThompsonによるJTableHeaderとBufferedImageの非常に一般的な問題

于 2012-10-18T12:15:24.590 に答える