ThinkGeo.com    |     Documentation    |     Premium Support

PdfExtension InMemoryMarkerLayer Scaling

Hi guys,


I'm trying to create a function for my customers so they can export their maps to a pdf file. Basically, the user would click a button to export a pdf file containing the map with the current extent, a title at the top of the page and a scalebar somewhere at the bottom. Here's my code: (questions follow)



                PdfDocument pdfDocument = new PdfDocument();
                PdfPage pdfPage = pdfDocument.AddPage();
                pdfPage.Size = PageSize.Letter;
                pdfPage.Orientation = PageOrientation.Landscape;
 
                float marginTop = 20.0f;
                float marginLeft = 20.0f;
 
                float drawingWidth = (float)pdfPage.Width.Point - marginLeft * 2;
                float drawingHeight = (float)pdfPage.Height.Point - marginTop * 2;
 
                RectangleShape printExtent = ExtentHelper.GetDrawingExtent(Map1.CurrentExtent, drawingWidth, drawingHeight);
 
                RectangleShape backupExtent = Map1.CurrentExtent;
                Map1.CurrentExtent = printExtent;
                
                Bitmap bitmap = Map1.GetBitmap((int)drawingWidth, (int)drawingHeight);
                MemoryStream stream = new MemoryStream();
                bitmap.Save(stream, ImageFormat.Png);
 
                // Draw the map image
                PdfGeoCanvas pdfGeoCanvas = new PdfGeoCanvas();
                pdfGeoCanvas.BeginDrawing(pdfPage, printExtent, GeographyUnit.Meter);
                pdfGeoCanvas.DrawScreenImage(new GeoImage(stream), drawingWidth * .5f, drawingHeight * .5f, drawingWidth, drawingHeight, DrawingLevel.LabelLevel, marginLeft, marginTop, 0f);
                pdfGeoCanvas.EndDrawing();
 
                // Draw title
                pdfGeoCanvas.BeginDrawing(pdfPage, printExtent, GeographyUnit.Meter);
                string titleText = String.Format("This is my map - {0}", DateTime.Now.ToString("D", CultureInfo.InvariantCulture));
                DrawingRectangleF titleExtent = pdfGeoCanvas.MeasureText(titleText, new GeoFont("Arial", 16));
                float titleLeft = (pdfGeoCanvas.Width - titleExtent.Width) / 2.0f + marginLeft;
                float titleTop = 10;
                pdfGeoCanvas.DrawTextWithScreenCoordinate(titleText, new GeoFont("Arial", 16), new GeoSolidBrush(GeoColor.StandardColors.Black), titleLeft, titleTop, DrawingLevel.LabelLevel);
                pdfGeoCanvas.EndDrawing();
 
                string targetFilePath = String.Format("{0}\\test.pdf", Server.MapPath("~/SHPDepot"));
                pdfDocument.Save(targetFilePath);
 
                Map1.CurrentExtent = backupExtent;
 


Questions: 

1- When I set Map1.CurrentExtent = printExtent to get a good image scale for the pdf page format, all the markers disappear (They're not visible in the resulting image/pdf). If I don't set Map1.CurrentExtent I can see the markers...but lose the scaling!


2- When I try to center the title horizontally the pdfGeoCanvas seems to shift the text depending on it's length (randomly?). I've also tried to align it to the left with fixed x and y coordinated but it still shifts the text!


3- What about adding a scale bar over the map? The GetBitmap function of the map control does not include the scalebar control in its snapshot.


I use MapSuite WebEdition 5.5.0.32. The map includes an OpenStreetMapLayer, ShapefileFeatureLayers and InMemoryMarkerOverlays.


Any help would be appreciated,


Thanks


Marc



 Marc,


 
Thanks for your question!
 
Based on your requirements of wanting to add a scale bar on your print out and export it to PDF I would recommend you take a look at the new Printing API's released recently in 5.5.  While the web edition doesn't have all of the interactive tools for printing that the WPF & Desktop edition have I believe these API's will allow you the most flexibility for creating a nice PDF in your web application.
 
We have a sample application that includes a video that explains the new API's, please check it out at the link below and let us know if you have any questions.
 
wiki.thinkgeo.com/wiki/Map_S...nt_Preview
 
Thanks!
 
 
 

Hello Clint,


Thanks for the answer. I've already taken a look at the Printing API (the clip and the sample project). Because I needed to do something in a very short time, I've opted for the PdfExtension solution. The Printing API looks very interesting for Desktop projects but, to be honest, I really don't know where to start for a WebEdition project. It would be great if you could supply us with a small sample (a map, a title and a scale bar) that would work with the web edition. Maybe just tell us what part of the Desktop sample project can I take to be able to create something quick in a web project.


 


Thanks again for your help,


Marc


 



Marc, 
  
   I will inquire with the Web team to see if they can provide the Web version of what you can find in the Code Community for printing. Thank you for your interest.

Marc,


 it is difficult to make a web printing sample similar to the desktop or Wpf. So in this sample, we focused on your three requirements. We are still in the middle of doing more research for a more complete web print sample. Thank you.



PrintingSample.zip (275 KB)

Thanks Val for the sample!  
  
 Unfortunately I cannot use the “loop-through-overlays” method to create my pdf because InMemoryMarkerOverlays do not have a “Draw” method. Also the ScaleBarAdornmentLayer doesn’t show up in the sample you gave me and there’s no title, which is something my customers would like to see in the pdf file. 
  
 I’d like to finalize that part before leaving for the Holidays, so if ever you can supply me with another solution that would be really appreciated. 
  
 Thanks again, 
  
 Marc

Marc,


 Attached is another sample for printing. Here you can print markers (click on the map to add marker), print the text label on the center and print ther scale. You can see how we implement all the logic. I think this is going to help you some more and I think that you are going to have to your own custom print on Web until we have a complete web printing solution in the future. Thank you.



001_CSharp_Sample.zip (101 KB)

Thanks a lot Val! This one will do the trick!  
  
 Happy Holidays to you and all the team! 
  
 Marc

Marc,


 You are very welcome. Enjoy the Holidays!