28 Aug

Java və PDF.

Bir neçə gün əvvəl, dostum sənədləri – CV, Diplom, tərcümələri yıgıb klinikaya göndərirdi. Lakin onlardan gələn şərt o idiki bütün sənədlər bir pdf faylda olmalıdır. Dostumda isə onlar bir neçə ayrı-ayrı pdf fayllarda idi. Məsələ elə program yazmag idi ki o iki pdf faylı bir birinə birləşdirsin və nəticədə bir pdf alınsın.

Bu ara boş vaxtım oldugu üçün bir ay fikirləşdim. Təzə öyrəndiyim Java programlaşdırma biliklərimi yoxlamaq üçün əla fürsət idi. İnternetdə axtarış verib pdf ile işləyən java library, onların istifadə gaydaları oxudugdan sonra – gərara gəldim ki iTextpdf library işlədim. Həmdə resenziyaları pis deyildi.

Ümumiyətlə iTextdf, standart FileChooser və GUİ üçün Swing işlətdim. Versiya 02 də GUI Netbeans/Intellij Idea ilə düzəldi. Versiya 01 dəki sadə kod :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.*;

//-------PDF------//
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;


public class PdfKleber extends JPanel
                             implements ActionListener {
    static private final String newline = "\n";
    JButton openButton1,openButton2, stickButton;
    JTextArea log;
    JFileChooser fc1,fc2;
    //

    public PdfKleber() {
        super(new BorderLayout());

        log = new JTextArea(5,20);
        log.setMargin(new Insets(5,5,5,5));
        log.setEditable(false);
        JScrollPane logScrollPane = new JScrollPane(log);
        fc1 = new JFileChooser();
        fc2 = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Pdf Files", "pdf");
        fc1.setFileFilter(filter);
        fc2.setFileFilter(filter);

        openButton1 = new JButton("1te pdf File öffnen.");
        openButton1.addActionListener(this);
       
        openButton2 = new JButton("2te pdf File öffnen.");
        openButton2.addActionListener(this);

        stickButton = new JButton("Kleben!");
        stickButton.addActionListener(this);

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(openButton1);
        buttonPanel.add(openButton2);
        buttonPanel.add(stickButton);

        add(buttonPanel, BorderLayout.PAGE_START);
        add(logScrollPane, BorderLayout.CENTER);
    }
   
   

    public void actionPerformed(ActionEvent e) {
       
        if (e.getSource() == openButton1) {
            int returnVal = fc1.showOpenDialog(PdfKleber.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file1 = fc1.getSelectedFile();
                log.append("Öffnung: " + file1.getName() + "." + newline);
            } else {
                log.append("Stopped bei user." + newline);
            }
            log.setCaretPosition(log.getDocument().getLength());

        }
       
        if (e.getSource() == openButton2) {
            int returnVal = fc2.showOpenDialog(PdfKleber.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file2 = fc2.getSelectedFile();
                log.append("Öffnung: " + file2.getName() + "." + newline);
            } else {
                log.append("Stopped bei user." + newline);
            }
            log.setCaretPosition(log.getDocument().getLength());

        }
       
          else if (e.getSource() == stickButton) {
             List<InputStream> list = new ArrayList<InputStream>();
                try {
                    list.add(new FileInputStream(fc1.getSelectedFile()));
                    list.add(new FileInputStream(fc2.getSelectedFile()));
                    OutputStream out = new FileOutputStream(new File("result.pdf"));
                    doMerge(list, out);
                    log.append("Kleben und Export in Result.pdf" + newline);
                }
               
                catch(FileNotFoundException ex){
                 log.append("Fehler!" + newline);
                }
                catch(DocumentException ex){
                 log.append("Fehler!" + newline);
                }
                catch(IOException ex){
                 log.append("Fehler!" + newline);
                }
                catch(NullPointerException ex){
                 log.append("Bitte, Wählen Sie pdf files!"+ newline);
                }
     
            log.setCaretPosition(log.getDocument().getLength());
          }
    }

      public static void doMerge(List<InputStream> list, OutputStream outputStream)
            throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();
        PdfContentByte cb = writer.getDirectContent();

        for (InputStream in : list) {
            PdfReader reader = new PdfReader(in);
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                document.newPage();
                PdfImportedPage page = writer.getImportedPage(reader, i);
                cb.addTemplate(page, 0, 0);
            }
        }

        outputStream.flush();
        document.close();
        outputStream.close();
    }
   
   
    private static void init() {

        JFrame frame = new JFrame("PdfKleber");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        frame.add(new PdfKleber());

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                UIManager.put("swing.boldMetal", Boolean.FALSE);
                init();
            }
        });
    }
}

Programda hansısa leksik səhvlər ola bilər. Həmdə standart FileChooserDemoya pdf funksiyasını əlavə olunmuş bir versiyadir. Yəginki kod hələ çox optimizasiya olunmalıdır. Dostum razı galdı. Əsas – işləyir :)
Versiya 02:
Source githubdan da yükləmək olur – https://github.com/biotin/PdfKleberV0.2
Hazır jar fayla isə buradan – PdfKleberV0.2
Versiya 01:
Source githubdan da yükləmək olur – https://github.com/biotin/PdfKleber .
Hazır jar fayla isə buradan – https://yadi.sk/d/KYqxK_Y8aYeAz .
İşlətmək üçün:

1
$ java -jar PdfBeta.jar
Tweet about this on TwitterShare on FacebookShare on Google+Share on RedditShare on VK