Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java iTextPdf JTextArea Unicode_Java_Swing_Unicode_Itextpdf - Fatal编程技术网

Java iTextPdf JTextArea Unicode

Java iTextPdf JTextArea Unicode,java,swing,unicode,itextpdf,Java,Swing,Unicode,Itextpdf,我能够将JTextArea unicode(devanagari)内容加载/保存到文件fine。我想把内容打印成pdf文件,所以我使用的是iTextPDF api。我的代码片段如下所示,它打印的是空文件,而不是包含内容的文件 package i18n; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.TextArea; import java.awt.ev

我能够将JTextArea unicode(devanagari)内容加载/保存到文件fine。我想把内容打印成pdf文件,所以我使用的是iTextPDF api。我的代码片段如下所示,它打印的是空文件,而不是包含内容的文件

package i18n;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

import com.itextpdf.awt.PdfGraphics2D;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;



public class MyNumbers extends JFrame {
    private ResourceBundle rb;
    private Font devanagariFont;

    public MyNumbers (String language, String fontFile) {
        loadResourceBundle(language);
        loadFont(fontFile);
        display();
    }

    TextArea txtArea;

    private void display() {
        String unicode = null;

        JPanel labels = new JPanel(new GridLayout(0,2));
        JLabel uni = null;
        for(int i=0; i<=10; i++) {
            unicode = rb.getString("" +i);
            labels.add(new JLabel("" + i));
            labels.add(uni = new JLabel(unicode));
            //uni.setFont(devanagariFont);
        }
        labels.add(new JLabel("Time"));
        labels.add(new ClockLabel());
        getContentPane().setLayout(new FlowLayout());
        Box b = Box.createVerticalBox();
        b.add(labels);
        b.add(txtArea = new TextArea(10, 40));
        getContentPane().add(b);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowOpened(WindowEvent e) {
                // TODO Auto-generated method stub
                try {
                    getInputContext().selectInputMethod(new Locale("hi", "IN"));
                    read();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

            @Override
            public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                try {
                    System.out.println(getInputContext().getLocale());
                    save();
                    print();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                System.exit(0);

            }


        });
        //setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);



    }


    String fileName = "MyNumbers.txt";
    private void save() throws IOException {
        File f = new File(fileName);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-16"));
        String txt = txtArea.getText();
        writer.write(txt);
        writer.flush();
        writer.close();
    }

    private void read() throws IOException {
        File f = new File(fileName);
        if(f.exists() == false) return;
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-16"));
        String line = null;
        while((line = reader.readLine()) != null) {
            txtArea.append(line + "\n");
        }
        reader.close();
    }

    private void loadFont(String fontFile) {
        try {
            InputStream input = getClass().getResourceAsStream(fontFile);
            Font b = Font.createFont(Font.TRUETYPE_FONT, input);
            devanagariFont = b.deriveFont(Font.PLAIN, 11);

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

    private void loadResourceBundle(String language) {
        String base = getClass().getName() + "rb";
        rb = ResourceBundle.getBundle(base, new Locale(language));

    }

    static class ClockLabel extends JLabel implements ActionListener {


        private ClockLabel() {
            new Timer(1000, this).start();
        }



        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        public void actionPerformed(ActionEvent e) {
            Calendar cal = Calendar.getInstance();
            setText(sdf.format(cal.getTime()));

        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MyNumbers("hi", "Devnew.ttf");      
            }
        });

    }

    String pdfFileName = "MyNumbers.pdf";
    private void print() {
        System.out.println("Printing PDF file ..");
        try { 
            Document document = new Document(PageSize.A4);  
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFileName));
            document.open();
            PdfContentByte cb = writer.getDirectContent( );
            PdfGraphics2D g2d = new PdfGraphics2D(cb, PageSize.A4.getWidth(), PageSize.A4.getHeight());
            System.out.println(txtArea.getSize());
            txtArea.print(g2d);
            g2d.dispose();
            document.close ();
        }
        catch(DocumentException de) {
            System.err.println(de.getMessage());
        }
        catch(IOException ioe) {
            System.err.println(ioe.getMessage());
        }
    }

}
请让我知道修复方法。假设swing JTextArea能够处理它,我不会为图形设置任何字体。unicode支持是通过indicim.jar输入法框架添加的。根据上面的输出,尺寸显示文本区域的大小不是零

为了测试上述内容,您需要2个文件:

并将其放置在jre/lib/ext中

MyNumbers.txt-devanagari中的unicode内容文件,如下所示,您可以自己在文本区域中键入,并在关机/启动时保存/加载程序。您可以将其保存在eclipse的项目目录中

अम२ जवान
अम२ जवान
अम२ जवान
अम२ जवान
अम२ जवान
अम२ जवान
अम२ जवान
अम२ जवान
अम२ जवान
ऊँ 

一个pdf文件将在eclipse项目目录中创建,但现在它是空的

问题是你没有打电话:

writer.close()

在你的PdfWriter上。将该行添加到
print()
方法的末尾应该可以做到这一点

编辑:

下面是一个适用于我的方法(您仍然需要将iText lib版本4.2.0添加到依赖项中):

import java.awt.Desktop;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;

public class MyNumbers extends JFrame {
    private Font devanagariFont;

    public MyNumbers(String language, String fontFile) {
        loadResourceBundle(language);
        loadFont(fontFile);
        display();
    }

    TextArea txtArea;

    private void display() {
        String unicode = null;

        JPanel labels = new JPanel(new GridLayout(0, 2));
        JLabel uni = null;
        for (int i = 0; i <= 10; i++) {
            unicode = String.valueOf(i);
            labels.add(new JLabel("" + i));
            labels.add(uni = new JLabel(unicode));
            // uni.setFont(devanagariFont);
        }
        labels.add(new JLabel("Time"));
        labels.add(new ClockLabel());
        getContentPane().setLayout(new FlowLayout());
        Box b = Box.createVerticalBox();
        b.add(labels);
        b.add(txtArea = new TextArea(10, 40));
        getContentPane().add(b);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowOpened(WindowEvent e) {
                // TODO Auto-generated method stub
                try {
                    getInputContext().selectInputMethod(new Locale("hi", "IN"));
                    read();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

            @Override
            public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                try {
                    System.out.println(getInputContext().getLocale());
                    save();
                    print();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                System.exit(0);

            }

        });
        // setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);

    }

    String fileName = "MyNumbers.txt";

    private void save() throws IOException {
        File f = new File(fileName);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-16"));
        String txt = txtArea.getText();
        writer.write(txt);
        writer.flush();
        writer.close();
    }

    private void read() throws IOException {
        File f = new File(fileName);
        if (f.exists() == false) {
            return;
        }
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-16"));
        String line = null;
        while ((line = reader.readLine()) != null) {
            txtArea.append(line + "\n");
        }
        reader.close();
    }

    private void loadFont(String fontFile) {
        try {
            InputStream input = getClass().getResourceAsStream(fontFile);
            Font b = Font.createFont(Font.TRUETYPE_FONT, input);
            devanagariFont = b.deriveFont(Font.PLAIN, 11);

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

    private void loadResourceBundle(String language) {
        String base = getClass().getName() + "rb";

    }

    static class ClockLabel extends JLabel implements ActionListener {

        private ClockLabel() {
            new Timer(1000, this).start();
        }

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        @Override
        public void actionPerformed(ActionEvent e) {
            Calendar cal = Calendar.getInstance();
            setText(sdf.format(cal.getTime()));

        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyNumbers("hi", "Devnew.ttf");
            }
        });

    }

    String pdfFileName = "MyNumbers.pdf";

    private void print() {
        System.out.println("Printing PDF file ..");
        try {
            File pdf = new File(pdfFileName);
            Document document = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdf));
            document.open();
            PdfContentByte cb = writer.getDirectContent();
            Graphics2D g2d = cb.createGraphics(PageSize.A4.getWidth(), PageSize.A4.getHeight());
            System.out.println(txtArea.getSize());
            txtArea.printAll(g2d);
            g2d.dispose();
            document.close();
            writer.flush();
            writer.close();
            Desktop.getDesktop().open(pdf);
        } catch (DocumentException de) {
            System.err.println(de.getMessage());
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }
    }

}
导入java.awt.Desktop;
导入java.awt.FlowLayout;
导入java.awt.Font;
导入java.awt.Graphics2D;
导入java.awt.GridLayout;
导入java.awt.TextArea;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Locale;
导入javax.swing.Box;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
导入com.lowagie.text.Document;
导入com.lowagie.text.DocumentException;
导入com.lowagie.text.PageSize;
导入com.lowagie.text.pdf.PdfContentByte;
导入com.lowagie.text.pdf.PdfWriter;
公共类MyNumber扩展了JFrame{
私有字体;
公共MyNumber(字符串语言、字符串文件){
loadResourceBundle(语言);
加载字体(fontFile);
显示();
}
TextArea txtArea;
专用void display(){
字符串unicode=null;
JPanel标签=新的JPanel(新的GridLayout(0,2));
JLabel uni=null;

对于(int i=0;我尝试发布一个。您的文本区域大小是否正确(0x0大小将导致一个空页面)?它是如何启动的?如果没有您的更多输入,就不可能帮助您更多。@GuillaumePolet我将其保留为基于代码片段的,以避免深入了解gui构造的细节,但为了便于任何人进行测试和修复,我现在提供所有细节。@Miten我发布了我用来完成此工作的代码。我使用了iText 4.2.0。下次您发布一些代码,尝试修剪重现问题不需要的所有内容,并尝试使其独立于外部文件等。@Guillaume Polet
Xxx.close()
,位于最后一个块中please@mKorbel如果这是代码中唯一要修复的东西…;-)但你说的没错,这应该嵌入到finally块中。@GuillaumePolet感谢您的解决方案。我将txtArea.print更改为txtArea.printAll,它成功了。我虽然看不到txtArea的完整内容。@GuillaumePolet如果txtArea有带段落和空白的文本,我如何让它显示在pdf文档中。我的意思是如何为了在pdf上完成良好的分页。目前,打印的所有内容都是可见的文本,组件也是如此。我只想将其设置为文本样式。我尝试了LineBreakMeasurer和TextLayout,但它们在打印到图形时忽略了文本中嵌入的新行。
import java.awt.Desktop;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.PageSize;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfWriter;

public class MyNumbers extends JFrame {
    private Font devanagariFont;

    public MyNumbers(String language, String fontFile) {
        loadResourceBundle(language);
        loadFont(fontFile);
        display();
    }

    TextArea txtArea;

    private void display() {
        String unicode = null;

        JPanel labels = new JPanel(new GridLayout(0, 2));
        JLabel uni = null;
        for (int i = 0; i <= 10; i++) {
            unicode = String.valueOf(i);
            labels.add(new JLabel("" + i));
            labels.add(uni = new JLabel(unicode));
            // uni.setFont(devanagariFont);
        }
        labels.add(new JLabel("Time"));
        labels.add(new ClockLabel());
        getContentPane().setLayout(new FlowLayout());
        Box b = Box.createVerticalBox();
        b.add(labels);
        b.add(txtArea = new TextArea(10, 40));
        getContentPane().add(b);
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowOpened(WindowEvent e) {
                // TODO Auto-generated method stub
                try {
                    getInputContext().selectInputMethod(new Locale("hi", "IN"));
                    read();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

            @Override
            public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                try {
                    System.out.println(getInputContext().getLocale());
                    save();
                    print();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                System.exit(0);

            }

        });
        // setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);

    }

    String fileName = "MyNumbers.txt";

    private void save() throws IOException {
        File f = new File(fileName);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-16"));
        String txt = txtArea.getText();
        writer.write(txt);
        writer.flush();
        writer.close();
    }

    private void read() throws IOException {
        File f = new File(fileName);
        if (f.exists() == false) {
            return;
        }
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-16"));
        String line = null;
        while ((line = reader.readLine()) != null) {
            txtArea.append(line + "\n");
        }
        reader.close();
    }

    private void loadFont(String fontFile) {
        try {
            InputStream input = getClass().getResourceAsStream(fontFile);
            Font b = Font.createFont(Font.TRUETYPE_FONT, input);
            devanagariFont = b.deriveFont(Font.PLAIN, 11);

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

    private void loadResourceBundle(String language) {
        String base = getClass().getName() + "rb";

    }

    static class ClockLabel extends JLabel implements ActionListener {

        private ClockLabel() {
            new Timer(1000, this).start();
        }

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

        @Override
        public void actionPerformed(ActionEvent e) {
            Calendar cal = Calendar.getInstance();
            setText(sdf.format(cal.getTime()));

        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyNumbers("hi", "Devnew.ttf");
            }
        });

    }

    String pdfFileName = "MyNumbers.pdf";

    private void print() {
        System.out.println("Printing PDF file ..");
        try {
            File pdf = new File(pdfFileName);
            Document document = new Document(PageSize.A4);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdf));
            document.open();
            PdfContentByte cb = writer.getDirectContent();
            Graphics2D g2d = cb.createGraphics(PageSize.A4.getWidth(), PageSize.A4.getHeight());
            System.out.println(txtArea.getSize());
            txtArea.printAll(g2d);
            g2d.dispose();
            document.close();
            writer.flush();
            writer.close();
            Desktop.getDesktop().open(pdf);
        } catch (DocumentException de) {
            System.err.println(de.getMessage());
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }
    }

}