Guten Morgen Gemeinde,
mit der folgenden Klasse schaffe ich es ein pdf-Dokument einwandfrei in einem Frame darzustellen :
Jedoch erscheint der nachträglich eingefügte Text 'Kopie' in der y-Richtung gespiegelt.
Die Koordinaten des Textes (200,800) lassen bei mir auch den Schluss zu, dass das Einlesen des Images
von unten nach oben erfolgt. Aber da habe ich nicht das vollständige Wissen.
Nun, mir ist auch nicht wichtig welche Koordinaten ich verwende, aber
den Text möchte ich in jedem Fall leserlich drauflegen.
Wie geht das ?
Danke im Voraus.
mit der folgenden Klasse schaffe ich es ein pdf-Dokument einwandfrei in einem Frame darzustellen :
Java:
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import javax.swing.*;
/**
*
*/
public class ImageMain implements ActionListener {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JPanel pan_center = new JPanel();
JPanel pan_south = new JPanel();
JScrollPane scroll = new JScrollPane(pan_center);
JButton bt_close = new JButton("zur Hauptseite");
JButton bt_print = new JButton("Pol 649 drucken");
File pdf;
RandomAccessFile raf;
FileChannel channel;
ByteBuffer buf;
PDFFile pdffile;
int sides = 0;
String fileName = "";
ArrayList<JLabel> list = new ArrayList<JLabel>();
public ImageMain(File pdfFile) throws IOException {
this.pdf = pdfFile;
this.raf = new RandomAccessFile(this.pdf, "r");
this.channel = raf.getChannel();
this.buf = channel
.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
this.pdffile = new PDFFile(buf);
// Die Anzahl der Seiten
this.sides = pdffile.getNumPages()+1;
// Der Name für die Titelleiste des Frames
this.fileName = pdfFile.toString().substring(pdfFile.toString().lastIndexOf("/")+1, pdfFile.toString().length());
}
public Container addComponentsToPane() {
Container pane = frame.getContentPane();
panel.setLayout(new BorderLayout());
// Das GridLayout benötigt die Seitenanzahl vom pdf-File
pan_center.setLayout(new GridLayout(sides -1, 1));
// Das Scrollen beschleunigen
scroll.getVerticalScrollBar().setUnitIncrement(16);
// Die Seiten vom PDFFile fangen bei 1 an
for (int i = 1; i < pdffile.getNumPages()+1; i++){
// draw the first page to an image
PDFPage page = pdffile.getPage(i);
// get the width and height for the doc at the default zoom
Rectangle rect = new Rectangle(0, 0, (int) page.getBBox()
.getWidth(), (int) page.getBBox().getHeight());
// Die Bilder in doppelter Größe erzeugen
Image img = page.getImage(rect.width * 2, rect.height * 2, // width
// &
// height
rect, // clip rect
null, // null for the ImageObserver
true, // fill background with white
true // block until drawing is done
);
Graphics2D graph = (Graphics2D) img.getGraphics();
graph.setFont(new Font("ARIAL", Font.BOLD, 20));
graph.setColor(Color.black);
graph.drawString("Kopie", 200, 800);
// Die ArrayList mit Labeln füllen
list.add(new JLabel(new ImageIcon(img)));
// Die Bilder der ArrayList in das Panel legen
pan_center.add(list.get(i -1));
}
panel.add(scroll, BorderLayout.CENTER);
pan_south.setLayout(new GridLayout(1, 4));
pan_south.add(new JLabel());
pan_south.add(bt_close);
bt_print.addActionListener(this);
pan_south.add(bt_print);
pan_south.add(new JLabel());
panel.add(pan_south, BorderLayout.SOUTH);
pane.add(panel);
return pane;
}
public void setup() throws IOException {
frame.setContentPane(addComponentsToPane());
frame.setTitle(fileName);
frame.setSize(1240, 900);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
}
public static void main(final String[] args) {
try{
ImageMain image = new ImageMain(
new File(
"Test.pdf"));
image.setup();
}
catch (IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
PrinterJob pjob = PrinterJob.getPrinterJob();
PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
pjob.setJobName(this.fileName);
Book book = new Book();
book.append(new PDFPrintPage(pdffile), pf, pdffile.getNumPages());
pjob.setPageable(book);
// Send print job to default printer
System.out.println(pjob.printDialog());
//pjob.print();
}
}
Jedoch erscheint der nachträglich eingefügte Text 'Kopie' in der y-Richtung gespiegelt.
Die Koordinaten des Textes (200,800) lassen bei mir auch den Schluss zu, dass das Einlesen des Images
von unten nach oben erfolgt. Aber da habe ich nicht das vollständige Wissen.
Nun, mir ist auch nicht wichtig welche Koordinaten ich verwende, aber
den Text möchte ich in jedem Fall leserlich drauflegen.
Wie geht das ?
Danke im Voraus.