From a3040588404c3e7cd2b118a0649ade9e481a032d Mon Sep 17 00:00:00 2001 From: Michael Peter Christen Date: Thu, 4 Dec 2014 01:21:24 +0100 Subject: [PATCH] added Image Events as another option to generate images with a mac if no Ghostscript is available or does not work... --- source/net/yacy/cora/util/Html2Image.java | 45 ++++++++++++++++++++++- source/net/yacy/kelondro/util/OS.java | 38 ++++++++++++------- 2 files changed, 68 insertions(+), 15 deletions(-) diff --git a/source/net/yacy/cora/util/Html2Image.java b/source/net/yacy/cora/util/Html2Image.java index 4c43df415..bba7bced2 100644 --- a/source/net/yacy/cora/util/Html2Image.java +++ b/source/net/yacy/cora/util/Html2Image.java @@ -30,10 +30,15 @@ import javax.swing.text.html.HTMLDocument; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.ImageView; +import net.yacy.document.ImageParser; +import net.yacy.kelondro.util.FileUtils; import net.yacy.kelondro.util.OS; +import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; +import java.awt.Image; +import java.awt.MediaTracker; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -128,8 +133,44 @@ public class Html2Image { // i.e. convert -density 300 -trim yacy.pdf[0] -trim -resize 1024x -crop x1024+0+0 -quality 75% yacy-convert-300.jpg // note: both -trim are necessary, otherwise it is trimmed only on one side. The [0] selects the first page of the pdf String command = convert.getAbsolutePath() + " -density " + density + " -trim " + pdf.getAbsolutePath() + "[0] -trim -resize " + width + "x -crop x" + height + "+0+0 -quality " + quality + "% " + image.getAbsolutePath(); - OS.execSynchronous(command); - return image.exists(); + List message = OS.execSynchronous(command); + if (image.exists()) return true; + ConcurrentLog.warn("Html2Image", "failed to create image with command: " + command); + for (String m: message) ConcurrentLog.warn("Html2Image", ">> " + m); + + // another try for mac: use Image Events using AppleScript in osacript commands... + // the following command overwrites a pdf with an png, so we must make a copy first + if (!OS.isMacArchitecture) return false; + File pngFile = new File(pdf.getAbsolutePath() + ".tmp.pdf"); + org.apache.commons.io.FileUtils.copyFile(pdf, pngFile); + String[] commandx = {"osascript", + "-e", "set ImgFile to \"" + pngFile.getAbsolutePath() + "\"", + "-e", "tell application \"Image Events\"", + "-e", "set Img to open file ImgFile", + "-e", "save Img as PNG", + "-e", "end tell"}; + //ConcurrentLog.warn("Html2Image", "failed to create image with command: " + commandx); + message = OS.execSynchronous(commandx); + for (String m: message) ConcurrentLog.warn("Html2Image", ">> " + m); + // now we must read and convert this file to a jpg with the target size 1024x1024 + try { + File newPngFile = new File(pngFile.getAbsolutePath() + ".png"); + pngFile.renameTo(newPngFile); + Image img = ImageParser.parse(pngFile.getAbsolutePath(), FileUtils.read(newPngFile)); + final Image scaled = img.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING); + final MediaTracker mediaTracker = new MediaTracker(new Container()); + mediaTracker.addImage(scaled, 0); + try {mediaTracker.waitForID(0);} catch (final InterruptedException e) {} + // finally write the image + final BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + bi.createGraphics().drawImage(scaled, 0, 0, width, height, null); + ImageIO.write(bi, "jpg", image); + newPngFile.delete(); + return image.exists(); + } catch (IOException e) { + ConcurrentLog.logException(e); + return false; + } } catch (IOException e) { e.printStackTrace(); return false; diff --git a/source/net/yacy/kelondro/util/OS.java b/source/net/yacy/kelondro/util/OS.java index 452a4b815..008b75562 100644 --- a/source/net/yacy/kelondro/util/OS.java +++ b/source/net/yacy/kelondro/util/OS.java @@ -196,19 +196,31 @@ public final class OS { FileUtils.deletedelete(starterFile); } - public static List execSynchronous(final String command) throws IOException { - // runs a unix/linux command and returns output as Vector of Strings - // this method blocks until the command is executed - final Process p = Runtime.getRuntime().exec(command); - final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); - String text; - final List output = new ArrayList(); - while ((text = in.readLine()) != null) { - output.add(text); - } - in.close(); - return output; - } + public static List execSynchronous(final String command) throws IOException { + // runs a unix/linux command and returns output as Vector of Strings + // this method blocks until the command is executed + final Process p = Runtime.getRuntime().exec(command); + return execSynchronousProcess(p); + } + + public static List execSynchronous(final String[] command) throws IOException { + // runs a unix/linux command and returns output as Vector of Strings + // this method blocks until the command is executed + final Process p = Runtime.getRuntime().exec(command); + return execSynchronousProcess(p); + } + + private static List execSynchronousProcess(Process p) throws IOException { + String line; + BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); + final List output = new ArrayList(); + while ((line = in.readLine()) != null) output.add(line); + in.close(); + in = new BufferedReader(new InputStreamReader(p.getErrorStream())); + while ((line = in.readLine()) != null) output.add(line); + in.close(); + return output; + } public static void main(final String[] args) { try {