Hallo zusammen, ich hatte da mal ein Problem, wo ich eine ganze Zeit dran war.
Ich habe mir in einem Programm, ein Vorschaubild von einem PDF gemacht, um Daten zu sortieren, wenn das PDF nicht mehr gebraucht wurde, dann sollte es per Button gelöscht werden.
Die PDF-Datei wurde aber immer vom Programm verwendet und aus diesem Grund konnte ich sie nicht löschen.
Um das Vorschaubild vom PDF zu erstellen, habe ich die Lib. „PDFRenderer“ genutzt.
Hier mal der Code, mit dem ich es versucht hatte:
public void pdfToImageView(File sourceFile) {
try {
// String sourceDir = "C:/test.pdf";// PDF file must be placed in DataGet folder
// String destinationDir = "C:/";//Converted PDF page saved in this folder
// File sourceFile = new File(sourceDir);
if (sourceFile.exists()) {
RandomAccessFile raf = new RandomAccessFile(sourceFile, "r");
FileChannel channel = raf.getChannel();
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
PDFFile pdf = new PDFFile(buf);
int pageNumber = 1;// which PDF page to be convert
PDFPage page = pdf.getPage(pageNumber);
System.out.println("getWidth: "+ page.getWidth());
System.out.println("getHeight: "+ page.getHeight());
float w = new Float(page.getWidth());
float h = page.getHeight();
// image dimensions
int width = Math.round(w);
int height = Math.round(h);
// create the image
Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Image image = page.getImage(width, height, rect, null, true, true );
Graphics2D bufImageGraphics = bufferedImage.createGraphics();
bufImageGraphics.drawImage(image, 0, 0, null);
javafx.scene.image.Image image2 = SwingFXUtils.toFXImage(bufferedImage, null);
imageProperty.setValue(image2);
buf.clear();
channel.close();
raf.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}Code-Sprache: JavaScript (javascript)
Hier mal die Methode, auf ein minimum gekürzt:
public void pdfToImageView(File sourceFile) {
try {
if (sourceFile.exists()) {
RandomAccessFileraf = new RandomAccessFile(sourceFile, "r");
FileChannel channel = raf.getChannel();
ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
buf.clear();
channel.close();
raf.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}Code-Sprache: PHP (php)
Nach langem suchen, hatte ich einen Bug-Bericht im Netz gefunden womit ich dann das Problem lösen konnte.
Man sollte nicht mit der Methode map() arbeiten.
Hier eine andere Methode, die das Problem gelöst hat und man die Methode map() umgehen kann:
public void pdfToImageView(File sourceFile) {
try {
if (sourceFile.exists()) {
RandomAccessFile raf = new RandomAccessFile(sourceFile, "rw");
FileChannel channel = raf.getChannel();
ByteBuffer buf = ByteBuffer.allocate((int)channel.size());
channel.read(buf);
buf.clear();
channel.close();
raf.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}Code-Sprache: PHP (php)