Index: /applications/editors/josm/plugins/pdfimport/.classpath
===================================================================
--- /applications/editors/josm/plugins/pdfimport/.classpath	(revision 23860)
+++ /applications/editors/josm/plugins/pdfimport/.classpath	(revision 23861)
@@ -5,4 +5,5 @@
 	<classpathentry combineaccessrules="false" kind="src" path="/JOSM"/>
 	<classpathentry kind="lib" path="lib/PDFClown.jar"/>
+	<classpathentry kind="lib" path="lib/pdfbox.jar" sourcepath="D:/Projects/Community/OSM/josm/pdfimport/pdfbox-1.3.1/pdfbox/src/main/java"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/GraphicsProcessor.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/GraphicsProcessor.java	(revision 23861)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/GraphicsProcessor.java	(revision 23861)
@@ -0,0 +1,469 @@
+package pdfimport;
+
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.Image;
+import java.awt.Paint;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.Stroke;
+import java.awt.RenderingHints.Key;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphVector;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ImageObserver;
+import java.awt.image.RenderedImage;
+import java.awt.image.renderable.RenderableImage;
+import java.text.AttributedCharacterIterator;
+import java.util.Map;
+
+public class GraphicsProcessor extends Graphics2D {
+
+	public PathOptimizer target;
+
+	public GraphicsProcessor(PathOptimizer target)
+	{
+		this.target = target;
+
+	}
+
+	@Override
+	public void addRenderingHints(Map<?, ?> hints) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void clip(Shape s) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void draw(Shape s) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawGlyphVector(GlyphVector g, float x, float y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawString(String str, int x, int y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawString(String str, float x, float y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawString(AttributedCharacterIterator iterator, int x, int y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawString(AttributedCharacterIterator iterator, float x,
+			float y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void fill(Shape s) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public Color getBackground() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Composite getComposite() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public GraphicsConfiguration getDeviceConfiguration() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public FontRenderContext getFontRenderContext() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Paint getPaint() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Object getRenderingHint(Key hintKey) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public RenderingHints getRenderingHints() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Stroke getStroke() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public AffineTransform getTransform() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void rotate(double theta) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void rotate(double theta, double x, double y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void scale(double sx, double sy) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setBackground(Color color) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setComposite(Composite comp) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setPaint(Paint paint) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setRenderingHint(Key hintKey, Object hintValue) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setRenderingHints(Map<?, ?> hints) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setStroke(Stroke s) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setTransform(AffineTransform Tx) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void shear(double shx, double shy) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void transform(AffineTransform Tx) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void translate(int x, int y) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void translate(double tx, double ty) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void clearRect(int x, int y, int width, int height) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void clipRect(int x, int y, int width, int height) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void copyArea(int x, int y, int width, int height, int dx, int dy) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public Graphics create() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void dispose() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawArc(int x, int y, int width, int height, int startAngle,
+			int arcAngle) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public boolean drawImage(Image img, int x, int y, Color bgcolor,
+			ImageObserver observer) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public boolean drawImage(Image img, int x, int y, int width, int height,
+			ImageObserver observer) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public boolean drawImage(Image img, int x, int y, int width, int height,
+			Color bgcolor, ImageObserver observer) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2,
+			int sx1, int sy1, int sx2, int sy2, ImageObserver observer) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2,
+			int sx1, int sy1, int sx2, int sy2, Color bgcolor,
+			ImageObserver observer) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void drawLine(int x1, int y1, int x2, int y2) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawOval(int x, int y, int width, int height) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void drawRoundRect(int x, int y, int width, int height,
+			int arcWidth, int arcHeight) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void fillArc(int x, int y, int width, int height, int startAngle,
+			int arcAngle) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void fillOval(int x, int y, int width, int height) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void fillRect(int x, int y, int width, int height) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void fillRoundRect(int x, int y, int width, int height,
+			int arcWidth, int arcHeight) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public Shape getClip() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Rectangle getClipBounds() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Color getColor() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Font getFont() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public FontMetrics getFontMetrics(Font f) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void setClip(Shape clip) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setClip(int x, int y, int width, int height) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setColor(Color c) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setFont(Font font) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setPaintMode() {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setXORMode(Color c1) {
+		// TODO Auto-generated method stub
+
+	}
+
+}
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/LoadPdfDialog.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/LoadPdfDialog.java	(revision 23860)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/LoadPdfDialog.java	(revision 23861)
@@ -47,5 +47,5 @@
 
 	private String fileName;
-	private PDFStreamProcessor data;
+	private PathOptimizer data;
 	private final OsmBuilder builder;
 	private OsmDataLayer layer;
@@ -411,5 +411,5 @@
 	}
 
-	private PDFStreamProcessor loadPDF(String fileName) {
+	private PathOptimizer loadPDF(String fileName) {
 		File file;
 
@@ -433,7 +433,8 @@
 		Page page = document.getPages().get(0);
 
-
-		PDFStreamProcessor processor = new PDFStreamProcessor(document);
-		processor.bounds = page.getBox();
+		PathOptimizer data = new PathOptimizer();
+		data.bounds = page.getBox();
+
+		PDFStreamProcessor processor = new PDFStreamProcessor(data, document);
 		Contents c = page.getContents();
 		processor.process(new ContentScanner(c));
@@ -441,5 +442,7 @@
 		document.delete();
 
-		return processor;
+		data.optimize();
+
+		return data;
 	}
 
@@ -483,5 +486,5 @@
 		}
 
-		DataSet data = builder.build(this.data, isFinal);
+		DataSet data = builder.build(this.data.getLayers(), isFinal);
 		this.layer = new OsmDataLayer(data, name, null);
 
@@ -506,5 +509,5 @@
 
 	private void saveLayer(java.io.File file) {
-		DataSet data = builder.build(this.data, true);
+		DataSet data = builder.build(this.data.getLayers(), true);
 		OsmDataLayer layer = new OsmDataLayer(data, file.getName(), file);
 
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/OsmBuilder.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/OsmBuilder.java	(revision 23860)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/OsmBuilder.java	(revision 23861)
@@ -50,5 +50,5 @@
 
 
-	public Bounds getWorldBounds(PDFStreamProcessor data) {
+	public Bounds getWorldBounds(PathOptimizer data) {
 		LatLon min = tranformCoords(data.bounds.getMinX(), data.bounds.getMinY());
 		LatLon max = tranformCoords(data.bounds.getMaxX(), data.bounds.getMaxY());
@@ -56,9 +56,9 @@
 	}
 
-	public DataSet build(PDFStreamProcessor data, boolean full) {
+	public DataSet build(List<LayerContents> data, boolean full) {
 
 		DataSet result = new DataSet();
 
-		for (LayerContents layer: data.getResult()) {
+		for (LayerContents layer: data) {
 			this.addLayer(result, layer, full);
 		}
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/PDFStreamProcessor.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/PDFStreamProcessor.java	(revision 23860)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/PDFStreamProcessor.java	(revision 23861)
@@ -15,7 +15,10 @@
 import it.stefanochizzolini.clown.documents.contents.objects.DrawRectangle;
 import it.stefanochizzolini.clown.documents.contents.objects.EndPathNoOp;
+import it.stefanochizzolini.clown.documents.contents.objects.Fill;
 import it.stefanochizzolini.clown.documents.contents.objects.FillEvenOdd;
+import it.stefanochizzolini.clown.documents.contents.objects.FillStroke;
 import it.stefanochizzolini.clown.documents.contents.objects.FillStrokeEvenOdd;
 import it.stefanochizzolini.clown.documents.contents.objects.GenericOperation;
+import it.stefanochizzolini.clown.documents.contents.objects.ModifyClipPath;
 import it.stefanochizzolini.clown.documents.contents.objects.Path;
 import it.stefanochizzolini.clown.documents.contents.objects.Stroke;
@@ -27,5 +30,4 @@
 import java.awt.Color;
 import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -36,8 +38,7 @@
 
 	private final LayerInfo info;
-	public Rectangle2D bounds;
 	int pathNo = 0;
 
-	PathOptimizer optimizer = new PathOptimizer();
+	PathOptimizer optimizer;
 	Map<LayerInfo, LayerInfo> multipathLayers = new HashMap<LayerInfo, LayerInfo>();
 	private GraphicsState state;
@@ -45,9 +46,9 @@
 	private DeviceGrayColorSpace graySpace;
 
-	public PDFStreamProcessor(Document doc) {
-
+	public PDFStreamProcessor(PathOptimizer target, Document doc) {
+
+		this.optimizer = target;
 		this.rgbSpace = new DeviceRGBColorSpace(doc);
 		this.graySpace = new DeviceGrayColorSpace(doc);
-
 		this.info = new LayerInfo();
 	}
@@ -57,9 +58,4 @@
 		this.graySpace = null;
 		this.state = null;
-		this.optimizer.optimize();
-	}
-
-	public List<LayerContents> getResult() {
-		return this.optimizer.getLayers();
 	}
 
@@ -201,9 +197,9 @@
 				}
 			}
-			else if (obj instanceof FillEvenOdd) {
+			else if (obj instanceof FillEvenOdd || obj instanceof Fill) {
 				this.info.fill = true;
 				this.info.stroke = false;
 			}
-			else if (obj instanceof FillStrokeEvenOdd){
+			else if (obj instanceof FillStrokeEvenOdd || obj instanceof FillStroke){
 				this.info.fill = true;
 				this.info.stroke = true;
@@ -229,4 +225,7 @@
 				points = new ArrayList<Point2D>(2);
 			}
+			else if (obj instanceof ModifyClipPath) {
+				//nothign here
+			}
 			else {
 				int a = 10;
@@ -273,5 +272,11 @@
 		ColorSpace space = col.getColorSpace();
 
-		if (space instanceof DeviceRGBColorSpace) {
+		if (space == null){
+			return new Color(
+					(float)col.getComponents()[0],
+					(float)col.getComponents()[1],
+					(float)col.getComponents()[2]);
+		}
+		else if (space instanceof DeviceRGBColorSpace) {
 			return new Color(
 					(float)col.getComponents()[0],
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/PathOptimizer.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/PathOptimizer.java	(revision 23860)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/PathOptimizer.java	(revision 23861)
@@ -2,4 +2,5 @@
 
 import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -14,4 +15,5 @@
 	private final Map<LayerInfo, LayerContents> layerMap;
 	private List<LayerContents> layers;
+	public Rectangle2D bounds;
 
 	public PathOptimizer()
@@ -70,4 +72,5 @@
 		}
 
+
 		List<LayerContents> newLayers = new ArrayList<LayerContents>();
 		int nr = 0;
Index: /applications/editors/josm/plugins/pdfimport/src/pdfimport/pdfbox/PdfBoxParser.java
===================================================================
--- /applications/editors/josm/plugins/pdfimport/src/pdfimport/pdfbox/PdfBoxParser.java	(revision 23861)
+++ /applications/editors/josm/plugins/pdfimport/src/pdfimport/pdfbox/PdfBoxParser.java	(revision 23861)
@@ -0,0 +1,47 @@
+package pdfimport.pdfbox;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Dimension;
+import java.io.File;
+import java.util.List;
+
+import org.apache.pdfbox.pdfviewer.PageDrawer;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.util.PDFStreamEngine;
+
+import pdfimport.GraphicsProcessor;
+import pdfimport.PathOptimizer;
+
+public class PdfBoxParser extends PDFStreamEngine{
+	private final PathOptimizer target;
+
+	public PdfBoxParser(PathOptimizer target){
+		this.target = target;
+	}
+
+	@SuppressWarnings("unchecked")
+	public void parse(File file) throws Exception
+	{
+		PDDocument document = PDDocument.load( file);
+
+		if( document.isEncrypted() ){
+			throw new Exception(tr("Encrypted documents not supported."));
+		}
+
+		List allPages = document.getDocumentCatalog().getAllPages();
+
+		if (allPages.size() != 1) {
+			throw new Exception(tr("The PDF file must have exactly one page."));
+		}
+
+		PDPage page = (PDPage)allPages.get(0);
+		PDRectangle pageSize = page.findMediaBox();
+		Dimension pageDimension = pageSize.createDimension();
+
+		GraphicsProcessor p = new GraphicsProcessor(target);
+		PageDrawer drawer = new PageDrawer();
+		drawer.drawPage(p, page, pageDimension);
+	}
+}
