eingefügter Text nach dem rendern spiegelverkehrt

Thomas Lorenz

Bekanntes Mitglied
Guten Morgen Gemeinde,

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.
 
Habe die Lösung gefunden.
Für alle die vielleicht vor einer ähnlichen Hürde stehen hier die Lösung :


Der Teil wo die Bilder eingelesen werden :

Java:
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
		    );
	    AffineTransform trans = AffineTransform.getRotateInstance(0,
		    rect.width >> 1, rect.height >> 1);
	    Graphics2D graph = (Graphics2D) img.getGraphics();
	    graph.setFont(new Font("ARIAL", Font.BOLD, 30));
	    graph.setColor(Color.black);
	    graph.setTransform(trans);
	    graph.drawString("-- zur Information --", 450, 60);
	    // 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));
	}
 

Neue Themen


Zurück
Oben