diff --git a/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties b/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties index 9f7b588..5019032 100644 --- a/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties +++ b/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties @@ -8,9 +8,11 @@ command.description.0 = Set the zoom level command.name.0 = Zoom commandParameter.name = zoomlevel command.name.1 = Toggle highlight +command.name.2 = Toggle auto-trimming command.tooltip = Zoom out command.tooltip.0 = Fit page to window command.tooltip.1 = Fit page to window width command.tooltip.2 = Zoom in command.tooltip.3 = Toggle link highlighting +command.tooltip.4 = Trim Page Margins context.name = PDF viewer \ No newline at end of file diff --git a/de.vonloesch.pdf4eclipse/icons/autotrim.png b/de.vonloesch.pdf4eclipse/icons/autotrim.png new file mode 100644 index 0000000..720a56f Binary files /dev/null and b/de.vonloesch.pdf4eclipse/icons/autotrim.png differ diff --git a/de.vonloesch.pdf4eclipse/plugin.xml b/de.vonloesch.pdf4eclipse/plugin.xml index fad2752..73f8e3b 100644 --- a/de.vonloesch.pdf4eclipse/plugin.xml +++ b/de.vonloesch.pdf4eclipse/plugin.xml @@ -56,6 +56,27 @@ + + + + + + + + + + @@ -190,6 +211,18 @@ + + + + + + diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java index f6b5c18..263bbac 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java @@ -7,6 +7,7 @@ * * Contributors: * Boris von Loesch - initial API and implementation + * Robert Bamler - auto-trimming of page margins ******************************************************************************/ package de.vonloesch.pdf4eclipse; @@ -16,6 +17,7 @@ import java.awt.geom.Rectangle2D.Double; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; +import java.awt.image.DataBufferInt; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; @@ -39,6 +41,7 @@ import org.eclipse.swt.widgets.Display; import de.vonloesch.pdf4eclipse.editors.PDFEditor; +import de.vonloesch.pdf4eclipse.editors.handlers.ToggleAutoTrimHandler; import de.vonloesch.pdf4eclipse.editors.handlers.ToggleLinkHighlightHandler; import de.vonloesch.pdf4eclipse.model.IPDFLinkAnnotation; import de.vonloesch.pdf4eclipse.model.IPDFPage; @@ -72,6 +75,11 @@ public class PDFPageViewer extends Canvas implements PaintListener, IPreferenceC private float zoomFactor; + private boolean autoTrimOn = true; + private Point trimOffset = new Point(0, 0); + private float horizontalTrimFactor = 1.0f; + private float verticalTrimFactor = 1.0f; + //private org.eclipse.swt.graphics.Image swtImage; /** @@ -178,6 +186,7 @@ public void run() { prefs.addPreferenceChangeListener(this); highlightLinks = prefs.getBoolean(ToggleLinkHighlightHandler.PREF_LINKHIGHTLIGHT_ID, true); + autoTrimOn = prefs.getBoolean(ToggleAutoTrimHandler.PREF_AUTOTRIM_ID, false); } @@ -299,13 +308,17 @@ public void showPage(IPDFPage page) { highlight = null; boolean resize = false; - int newW = Math.round(zoomFactor*page.getWidth()); - int newH = Math.round(zoomFactor*page.getHeight()); + // always round _down_ so that the fit-to-screen commands work properly + int newW = (int) (zoomFactor*page.getWidth()); + int newH = (int) (zoomFactor*page.getHeight()); Point sz = getSize(); if (sz.x == 0 || sz.y == 0) return; currentImage = page.getImage(newH, newW); + if (autoTrimOn) { + trimCurrentImage(); + } newW = currentImage.getWidth(null); newH = currentImage.getHeight(null); @@ -329,16 +342,97 @@ public void showPage(IPDFPage page) { } } + private void trimCurrentImage() { + if (currentImage==null) + return; + + int origw = currentImage.getWidth(null); + int origh = currentImage.getHeight(null); + if (origw<1 || origh<1) + return; + + BufferedImage img = new BufferedImage(origw, origh, BufferedImage.TYPE_INT_ARGB); + img.getGraphics().drawImage(currentImage, 0, 0, origw, origh, 0, 0, origw, origh, null); + + int[] srcbuf = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); + + // detect upper margin + int trimy1 = origh; + int referenceColor = srcbuf[0]; + for (int i=0; i!=srcbuf.length; i++) { + if (srcbuf[i] != referenceColor) { + trimy1 = i/origw; + break; + } + } + + // detect lower margin + int trimy2 = 0; + referenceColor = srcbuf[srcbuf.length-1]; + for (int i=srcbuf.length-1; i!=trimy1*origw-1; i--) { + if (srcbuf[i] != referenceColor) { + trimy2 = i/origw + 1; + break; + } + } + + // detect left margin + int trimx1 = 0; + referenceColor = srcbuf[0]; + int offset = trimy1*origw; + int end = trimy2*origw; + trimx1loop: + while (trimx1 != origw) { + for (int i=offset+trimx1; i