Itext PDF print File gelockt by Java

Ghostman1711

Mitglied
Hallo,
Ich habe diesen Code:
Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.swing.JOptionPane;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFRenderer;

public class PDFPrinter {

    public PDFPrinter(File file) {
        try {
            FileInputStream fis = new FileInputStream(file);
            FileChannel fc = fis.getChannel();
            ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
            PDFFile pdfFile = new PDFFile(bb); // Create PDF Print Page
            PDFPrintPage pages = new PDFPrintPage(pdfFile);

            // Create Print Job
            PrinterJob pjob = PrinterJob.getPrinterJob();
            PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
            Paper a4paper = new Paper();
            double paperWidth = 8.26;
            double paperHeight = 11.69;
            a4paper.setSize(paperWidth * 72.0, paperHeight * 72.0);

            /*
             * set the margins respectively the imageable area
             */
            double leftMargin = 0.3;
            double rightMargin = 0.3;
            double topMargin = 0.5;
            double bottomMargin = 0.5;

            a4paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0,
                    (paperWidth - leftMargin - rightMargin) * 72.0,
                    (paperHeight - topMargin - bottomMargin) * 72.0);
            pf.setPaper(a4paper);

            pjob.setJobName(file.getName());
            Book book = new Book();
            book.append(pages, pf, pdfFile.getNumPages());
            pjob.setPageable(book);

            // Send print job to default printer
            if (pjob.printDialog()) {
                pjob.print();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (PrinterException e) {
            JOptionPane.showMessageDialog(null, "Printing Error: "
                    + e.getMessage(), "Print Aborted",
                    JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
        }
    }

    class PDFPrintPage implements Printable {
        private PDFFile file;

        PDFPrintPage(PDFFile file) {
            this.file = file;
        }

        public int print(Graphics g, PageFormat format, int index)
                throws PrinterException {
            int pagenum = index + 1;

            // don't bother if the page number is out of range.
            if ((pagenum >= 1) && (pagenum <= file.getNumPages())) {
                // fit the PDFPage into the printing area
                Graphics2D g2 = (Graphics2D) g;
                PDFPage page = file.getPage(pagenum);
                double pwidth = format.getImageableWidth();
                double pheight = format.getImageableHeight();

                double aspect = page.getAspectRatio();
                double paperaspect = pwidth / pheight;

                Rectangle imgbounds;

                if (aspect > paperaspect) {
                    // paper is too tall / pdfpage is too wide
                    int height = (int) (pwidth / aspect);
                    imgbounds = new Rectangle(
                            (int) format.getImageableX(),
                            (int) (format.getImageableY() + ((pheight - height) / 2)),
                            (int) pwidth, height);
                } else {
                    // paper is too wide / pdfpage is too tall
                    int width = (int) (pheight * aspect);
                    imgbounds = new Rectangle(
                            (int) (format.getImageableX() + ((pwidth - width) / 2)),
                            (int) format.getImageableY(), width, (int) pheight);
                }

                // render the page
                PDFRenderer pgs = new PDFRenderer(page, g2, imgbounds, null,
                        null);
                try {
                    page.waitForFinish();
                    pgs.run();
                } catch (InterruptedException ie) {
                }

                return PAGE_EXISTS;
            } else {
                return NO_SUCH_PAGE;
            }
        }
    }
}

Ich rufe ihn mit:
Java:
new PDFPrinter(file);
auf und er startet den Druckvorgang.
Nur wenn ich fertig bin und z.B. das selbe nochmaltun will ist der file also das PDF von Java gelockt und ich muss erst java neu starten. Wie kann ich das lösen??
 
X

Xyz1

Gast
fis wird nirgendwo geschlossen. #close() reicht er dann weiter. Ein bisschen nachdenken wäre cool.
 
X

Xyz1

Gast
Zwischen
bb
und
pdfFile
.
Nachdem es im Buffer ist. Aber keine Garantie, dass nicht noch i-wo etwas geöffnet wird. Ich hab auch nicht alles gelesen. Blockiert das Drucken? Bis später
 

Meniskusschaden

Top Contributor
Zu iText kann ich leider nichts beitragen, aber falls du eine Fehlermeldung bekommst, solltest du sie vielleicht noch posten. Ausserdem solltest du keine leeren catch-Blöcke verwenden.
 

Meniskusschaden

Top Contributor
Vielleicht verstehe ich es noch nicht richtig, aber was hat das eigentlich mit iText zu tun? Im Quelltext sehe ich dazu keinen Zusammenhang.

Bei mir funktioniert dein Code übrigens auch bei mehrfachem Aufruf ohne Neustart. Vielleicht sperrst du die Datei im nicht geposteten Teil deines Programms.
 

mrBrown

Super-Moderator
Mitarbeiter
Der FIS sollte beim GC automatisch geschlossen werden und auch der Lock sollte beim Programmende automatisch freigegeben werden.

Beendet sich dein Programm oder läuft das endlos?
Ansonsten kannst du try-with-resouces benutzen, dann wird der Stream auf jeden Fall geschlossen, ich würd aber nicht denken, dass es daran liegt...
 

Ghostman1711

Mitglied
Das Programm muss danach noch weiterlaufen... also neustart kommt nicht in frage
Also ich habe den Fehler, der fis.close() funktioniert nicht. Die Datei wird nicht freigegeben. Aber wie kann ich das lösen?? Jemand eine Idee
 

mrBrown

Super-Moderator
Mitarbeiter
Das Problem ist wohl der ByteBuffer, der locked die File, is er gc'ed wird (Was aber nicht erklärt, warum die Datei nach Programmende noch gelocked ist, da dürfe irgendwo noch ein weiteres Problem stecken)

Lösungsvorschlag wäre (wenn du zwingend ByteBuffer brauchst), die Datei als ganzes in ein Array zu lesen, und aus diesem einen ByteBuffer zu erstellen, die Datei wird dann gar nicht erst gelocked.
 

Meniskusschaden

Top Contributor
Auch wenn die Datei gesperrt ist, sollte es möglich sein, sie mehrmals zu drucken. Ich vermute deshalb, dass außerhalb des gezeigten Codes eine neue Datei unter demselben Namen erstellt werden soll und dabei das Problem auftritt. In dem Fall könnte es auch eine Alternative sein, jeweils einen neuen Namen für die temporären Dateien zu benutzen.

Was aber nicht erklärt, warum die Datei nach Programmende noch gelocked ist, da dürfe irgendwo noch ein weiteres Problem stecken
Ich glaube, der TO meinte mit "ich muss erst java neu starten", dass er sein Programm beenden und neu starten muß, damit es wieder funktioniert. Wahrscheinlich ist die Datei nach Programmende also nicht mehr gesperrt. So habe ich ihn zumindest verstanden.
 

Ghostman1711

Mitglied
Ich wollte mich nicht solange mit dem Thema beschäftigen und hab einfach jetzt kurzen Prozess gemacht und mit einen neuen Code geschrieben. Hier nochmal für Alle...

Java:
public static void printPdf (String filePath, String jobName) throws IOException, PrinterException {

        FileInputStream fileInputStream = new FileInputStream(filePath);
        byte[] pdfContent = new byte[fileInputStream.available()];
        fileInputStream.read(pdfContent, 0, fileInputStream.available());
        ByteBuffer buffer = ByteBuffer.wrap(pdfContent);

        final PDFFile pdfFile1 = new PDFFile(buffer);
        pdf_print_engine pages1 = new pdf_print_engine(pdfFile1);
        PrinterJob pjob = PrinterJob.getPrinterJob();
        PageFormat pfDefault = PrinterJob.getPrinterJob().defaultPage();
        Paper defaultPaper = new Paper();
        defaultPaper.setImageableArea(0, 0, defaultPaper.getWidth(), defaultPaper.getHeight());
        pfDefault.setPaper(defaultPaper);
        pjob.setJobName("Test");
        if (pjob.printDialog()) {
            // validate the page against the chosen printer to correct
            // paper settings and margins
            pfDefault = pjob.validatePage(pfDefault);
            Book book = new Book();

            book.append(pages1, pfDefault, pdfFile1.getNumPages());
            pjob.setPageable(book);

            try {
                pjob.print();
            } catch (PrinterException exc) {
                System.out.println(exc);
            }
        }


        fileInputStream.close();
    }

Er wird mit
Java:
try {
            printPdf(file.toString(), "Print");
        } catch (PrinterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

auf gerufen...

Der Code hinter dieser Zeile:
Java:
pdf_print_engine pages1 = new pdf_print_engine(pdfFile1);
Ist:
Java:
public class pdf_print_engine implements Printable {

    private PDFFile file;
    private PrinterJob pjob;
    private JDialog pd;
    private JLabel pagenumlabel;
    private JButton cancel;

    public pdf_print_engine(PDFFile file) {
        this.file = file;
    }

    static void printFile(String filename, boolean setupPaper) throws IOException {
        File file = new File(filename);
        FileInputStream fis = new FileInputStream(file);
        FileChannel fc = fis.getChannel();
        ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
        PDFFile pdfFile = new PDFFile(bb); // Create PDF Print Page
        fis.close();
       
        pdf_print_engine pages = new pdf_print_engine(pdfFile);

        PrinterJob pjob = PrinterJob.getPrinterJob();
        PageFormat pfDefault = PrinterJob.getPrinterJob().defaultPage();
        Paper defaultPaper = new Paper();
        defaultPaper.setImageableArea(0, 0, defaultPaper.getWidth(), defaultPaper.getHeight());
        pfDefault.setPaper(defaultPaper);
        if (setupPaper) {
            pfDefault = PrinterJob.getPrinterJob().pageDialog(pfDefault);
        }
        pjob.setJobName(file.getName());
        if (pjob.printDialog()) {
            // validate the page against the chosen printer to correct
            // paper settings and margins
            pfDefault = pjob.validatePage(pfDefault);
            Book book = new Book();

            book.append(pages, pfDefault, pdfFile.getNumPages());
            pjob.setPageable(book);

            try {
                pjob.print();
            } catch (PrinterException exc) {
                System.out.println(exc);
            }
        }
    }

    private void createPrintDialog() {
        pd = new JDialog((Frame) null, "Printing...", false);
        Container top = pd.getContentPane();
        Box lines = Box.createVerticalBox();
        Box line = Box.createHorizontalBox();
        line.add(new JLabel("Now printing: "));
        JLabel title = new JLabel("file.pdf");
        line.add(title);
        lines.add(line);

        line = Box.createHorizontalBox();
        line.add(Box.createHorizontalStrut(10));
        line.add(new JLabel("page "));
        pagenumlabel = new JLabel("1");
        line.add(pagenumlabel);
        line.add(new JLabel(" of "));
        JLabel totalpages = new JLabel(String.valueOf(file.getNumPages()));
        line.add(totalpages);
        lines.add(line);

        top.add(lines, BorderLayout.CENTER);

        Box cancelbox = Box.createHorizontalBox();
        cancelbox.add(Box.createHorizontalGlue());
        cancel = new JButton(new AbstractAction("Cancel") {

            @Override
            public void actionPerformed(ActionEvent evt) {
                doCancel();
            }
        });
        cancelbox.add(cancel);
        top.add(cancelbox, BorderLayout.SOUTH);
    }

    public void show(PrinterJob pjob) {
        this.pjob = pjob;
        if (pd == null) {
            createPrintDialog();
        }
        pd.pack();
        pd.setVisible(true);
    }

    /**
     * Close the progress dialog. Don't use this method to cancel the print job;
     * use {@link #doCancel doCancel} instead.
     */
    public void hide() {
        pd.dispose();
    }

    /**
     * Cancel the print job. Disables the cancel button, as it might take a
     * while for the cancel to take effect.
     */
    public void doCancel() {
        cancel.setEnabled(false);
        pjob.cancel();
    }

    // from Printable interface: prints a single page, given a Graphics
    // to draw into, the page format, and the page number.
    @Override
    public int print(Graphics g, PageFormat format, int index) throws PrinterException {
        int pagenum = index + 1;

        // don't bother if the page number is out of range.
        if ((pagenum >= 1) && (pagenum <= file.getNumPages())) {

            // update the page number in the progress dialog
            if (pagenumlabel != null) {
                pagenumlabel.setText(String.valueOf(pagenum));
            }

            // fit the PDFPage into the printing area
            Graphics2D g2 = (Graphics2D) g;
            PDFPage page = file.getPage(pagenum);
            double pwidth = format.getImageableWidth();
            double pheight = format.getImageableHeight();

            double aspect = page.getAspectRatio();

            double paperaspect = pwidth / pheight;
            if (paperaspect < 1.0) {
                switch (format.getOrientation()) {
                case PageFormat.REVERSE_LANDSCAPE:
                case PageFormat.LANDSCAPE:
                    format.setOrientation(PageFormat.PORTRAIT);
                    break;
                case PageFormat.PORTRAIT:
                    format.setOrientation(PageFormat.LANDSCAPE);
                    break;
                }
                pwidth = format.getImageableWidth();
                pheight = format.getImageableHeight();
                paperaspect = pwidth / pheight;
            }

            Rectangle imgbounds;
            int width;
            int height;
            if (aspect > paperaspect) {
                // paper is too tall / pdfpage is too wide
                height = (int) (pwidth / aspect);
                width = (int) pwidth;
            } else {
                // paper is too wide / pdfpage is too tall
                width = (int) (pheight * aspect);
                height = (int) pheight;
            }
            imgbounds = new Rectangle((int) format.getImageableX(), (int) format.getImageableY(), width, height);

            // render the page
            PDFRenderer pgs = new PDFRenderer(page, g2, imgbounds, null, null);
            try {
                page.waitForFinish();
                pgs.run();
            } catch (InterruptedException ie) {
            }
            return PAGE_EXISTS;
        } else {
            return NO_SUCH_PAGE;
        }
    }
}

Das Thema ist dann hiermit eigentlich geschlossen...
Danke nochmal für all eure Hilfe...
Ghostman1711
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M iText Zelleninhalt formatieren Java Basics - Anfänger-Themen 2
J Itext-Paragraph Position ändern Java Basics - Anfänger-Themen 13
F iText download/installieren Java Basics - Anfänger-Themen 22
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
K Java iText: The document has no pages. Java Basics - Anfänger-Themen 9
M itext footer newline Java Basics - Anfänger-Themen 3
S Itext und eine neue Zeile einfügen Java Basics - Anfänger-Themen 2
Scorpi41 HTLM2PDF via IText Java Basics - Anfänger-Themen 8
N iText PDF Fehler, java.lang.ClassNotFoundException: com.lowagie.text.Phrase Java Basics - Anfänger-Themen 7
T Formatieren von Zellen einer PdfPTable mit IText Java Basics - Anfänger-Themen 3
T iText Header Java Basics - Anfänger-Themen 3
I PDF aus JSF - Seite drucken mit iText Java Basics - Anfänger-Themen 5
W iText - Layer aus PDF heraus löschen Java Basics - Anfänger-Themen 1
D iText.jar mit meiner bat.datei einbinden Java Basics - Anfänger-Themen 10
J iText und so ^^ Java Basics - Anfänger-Themen 3
A IText, wo fange ich an? Java Basics - Anfänger-Themen 5
G iText mehrdeutiges Font Java Basics - Anfänger-Themen 2
J itext - Rechteck in PdfCell Java Basics - Anfänger-Themen 2
H itext verwenden mit jar Java Basics - Anfänger-Themen 2
S Drucken mit iText? Java Basics - Anfänger-Themen 7
R PDF erzeugen mit iText Java Basics - Anfänger-Themen 5
G Frage zu itext -> OutOfMemoryError Java Basics - Anfänger-Themen 5
P Eclipse "aufraeumen", iText-Lizenz, Exe-Datei erst Java Basics - Anfänger-Themen 7
H iText implementieren Java Basics - Anfänger-Themen 7
G Kassenbon mit itext Java Basics - Anfänger-Themen 4
F iText mit ppt ? Java Basics - Anfänger-Themen 3
H Print und Println Java Basics - Anfänger-Themen 13
123456789sssssaaaa Which is the best way to Print Fibonacci Series in Java? Java Basics - Anfänger-Themen 3
H awt.print. Java Basics - Anfänger-Themen 0
Kotelettklopfer Stringbuilder mit print ausgeben Java Basics - Anfänger-Themen 83
paulen1 Methoden Unerwünschte Ausgabe bei System.out.print in For-Schleife Java Basics - Anfänger-Themen 8
Y Wie kann man überprüfen, ob bei einem Print Befehl tatsächlich etwas geprintet wurde? Java Basics - Anfänger-Themen 4
S Anweisungen verstehen System.out.print/println Java Basics - Anfänger-Themen 2
B Input/Output System.out.print mit und ohne "" Java Basics - Anfänger-Themen 5
L system.print.out geht nicht Java Basics - Anfänger-Themen 11
B Print Service Java Basics - Anfänger-Themen 5
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I Print Monitor Java Basics - Anfänger-Themen 0
I Drucken (Print) monitoren Java Basics - Anfänger-Themen 0
S Unterschied print() und println() Java Basics - Anfänger-Themen 3
J Umgang mit System.out.println() und .print() Java Basics - Anfänger-Themen 6
C Kleines Problem mit System.out.print Java Basics - Anfänger-Themen 1
R Char wird in System.out.print(); nicht ausgegeben Java Basics - Anfänger-Themen 6
T System.out.print : Frage zu Aufbau Java Basics - Anfänger-Themen 4
J Erste Schritte System.out.print (Fehlermeldung) Java Basics - Anfänger-Themen 14
X Eclipse System.out.print fehler Java Basics - Anfänger-Themen 5
K char-int-Addition in System.out.print Java Basics - Anfänger-Themen 3
A Feststellen ob Desktop.print("*.pdf") fertig ist Java Basics - Anfänger-Themen 6
Junb Sys.Out.Print - aus Methode zugreifen Java Basics - Anfänger-Themen 6
G DRUCKEN von z.B. eines JFrame über print(Graphics g) Java Basics - Anfänger-Themen 9
S [JUnit] Print Results while running Java Basics - Anfänger-Themen 6
J print button Java Basics - Anfänger-Themen 2
T Dezimaltrennzeichen bei Ausgabe mit print ändern Java Basics - Anfänger-Themen 4
ruutaiokwu System.err.print(ln) macht ein durcheinander??! Java Basics - Anfänger-Themen 8
J print-Anweisung verschluckt Java Basics - Anfänger-Themen 3
S Print Methode zweier "Classes" kombinieren Java Basics - Anfänger-Themen 2
O Drucker: print methode wird 2 mal aufgerufen nachfrage Java Basics - Anfänger-Themen 4
J Fragen zu System.out.print und charAt Java Basics - Anfänger-Themen 3
S 2 kleine Methoden negieren und print Java Basics - Anfänger-Themen 8
D System.out.print(0101); =65. Warum? Java Basics - Anfänger-Themen 3
E Mehrfache print ausgabe ohne Schleife oder Rekursiven aufruf? Java Basics - Anfänger-Themen 48
M to pdf print process starten Java Basics - Anfänger-Themen 4
C javax.print.DocPrintJob Java Basics - Anfänger-Themen 17
F print in java Java Basics - Anfänger-Themen 3
W Die Methode print() wird 2 mal für jede Seite aufgerufen Java Basics - Anfänger-Themen 9
B Objekt Orintiertes Programmieren ausgabe Fehler mit Print() Java Basics - Anfänger-Themen 4
S print()! Java Basics - Anfänger-Themen 2
L PrintWriter autoflush: println funktioniert, print nicht Java Basics - Anfänger-Themen 3
G Auswahl:in File schreiben, oder System.out.print Java Basics - Anfänger-Themen 4
J System.out.print Java Basics - Anfänger-Themen 5
S Listen - insert - print etc. Dringend! Bitte! Java Basics - Anfänger-Themen 6
H Print Methode Java Basics - Anfänger-Themen 6
C System.out.print oder println ? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
R File.pathSeparator und File.separator Java Basics - Anfänger-Themen 46
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
G jar file lässt sich nicht öffnen Java Basics - Anfänger-Themen 1
N Textdatei aus Resourcen-Ordner eines Projekts/ jar-file lesen Java Basics - Anfänger-Themen 4
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
berserkerdq2 IOstreams, was unterscheidet file von z. B. BufferedWriter? Java Basics - Anfänger-Themen 11
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
A java jar-File Java Basics - Anfänger-Themen 1
E Executable jar file fehler Java Basics - Anfänger-Themen 9
I Upload File zu einem Webservice Java Basics - Anfänger-Themen 17
I ZIP File erstellen Java Basics - Anfänger-Themen 10
LeoDerKek Textdatei in JAR-File Java Basics - Anfänger-Themen 4
Tom/S File Java Basics - Anfänger-Themen 10
AleXusher Mehrdimensionales Array aus txt.file auslesen Java Basics - Anfänger-Themen 4
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
H Java file nicht gefunden Java Basics - Anfänger-Themen 5
C File speichern Java Basics - Anfänger-Themen 5
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
C Pfad zu Properties-File bei ResourceBundle Java Basics - Anfänger-Themen 7
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
rafi072001 Lesen aus einem Excel File Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben