ThinkGeo.com    |     Documentation    |     Premium Support

Printing a legend in PDFCanvas

Hi,


I´m using an AdornmentLayer to create a legend in a Map control as I saw in LegendAdornmentSample and it works fine. I´m using the PDFCanvads to print-preview my maps. However, the code I found to print the adornment layer doesn´t have the code to print the color bitmaps, only the labels.


Do you have an example showing how to print the legend bitmaps in PDFCanvas?


To clarify this, I uploaded to files, a view of the legend in the map control and the PDF printed one, without the color bitmaps.


Thanks in advance,


Mauro Assis


 


 


 


 



Print.pdf (386 KB)

Mauro, 
  
 Could you provide your sample code? That will to easier to solve your problem. If you think the code is private you can send it to support@thinkgeo.com and let him forward to James. 
  
 Thanks 
 James

James, no problem.


1)  here is the code to I'm using to create legend in MapControl:


        private void DrawThematicItems(GeoCanvas canvas, FeatureLayer layer, float xOffset, float yOffset, GeoFont font)

        {

            GdiPlusGeoCanvas legendCanvas = new GdiPlusGeoCanvas();

            Bitmap legendBitmap = null;

            int themeIndent = 10;

            ValueStyle valueStyle = (ValueStyle)layer.ZoomLevelSet.ZoomLevel01.CustomStyles[1];

            foreach (ValueItem vi in valueStyle.ValueItems)

            {

                try

                {

                    legendBitmap = new Bitmap((int)legendIconWidth, (int)legendIconHeight);

                    legendCanvas.BeginDrawing(legendBitmap, new RectangleShape(0, legendIconWidth, legendIconHeight, 0), GeographyUnit.DecimalDegree);

                    vi.DefaultAreaStyle.DrawSample(legendCanvas);

                    legendCanvas.Flush();

                    DrawingRectangleF layerRectangle = canvas.MeasureText(string.IsNullOrEmpty(vi.Value)? "(não informado)" : vi.Value, font);

                    if (canvas is GdiPlusGeoCanvas)

                    {

                        ((GdiPlusGeoCanvas)canvas).DrawScreenImageWithoutScaling(legendBitmap, themeIndent + xOffset, yOffset + layerRectangle.Height / 2, DrawingLevel.LevelOne, 0, 0, 0);

                    }

                    DrawText(canvas, themeIndent + xOffset + layerRectangle.Width / 2 + 12, yOffset + layerRectangle.Height / 2, font, vi.Value);

                    // Update y offset.

                    yOffset += (legendIconHeight + 2);


                }

                finally

                {

                    legendCanvas.EndDrawing();

                    if (legendBitmap != null)

                    {

                        legendBitmap.Dispose();

                        legendBitmap = null;

                    }

                }

            }

        }


2) This is the code that prints to the PdfGeoCanvas:


         private void bPrint_ItemClick(object sender, ItemClickEventArgs e)

        {

            PdfSharp.Pdf.PdfDocument document = new PdfSharp.Pdf.PdfDocument();

            PdfSharp.Pdf.PdfPage page = document.AddPage();


            PdfGeoCanvas pdfGeoCanvas = new PdfGeoCanvas();


            Collection<SimpleCandidate> labelsInLayers = new Collection<SimpleCandidate>();

            pdfGeoCanvas.BeginDrawing(page, ExtentHelper.GetDrawingExtent(Map.CurrentExtent,

                (float)(page.Width.Point), (float)(page.Height.Point)), GeographyUnit.Meter);

            foreach (Layer layer in GISHelper.Overlay.Layers)

            {

                layer.Open();

                layer.Draw(pdfGeoCanvas, labelsInLayers);

                layer.Close();

                pdfGeoCanvas.Flush();

            }

            if (LegendInMap.EditValue.ToString() == "Apenas na Impressão")

                CreateLegend();

            for (int i = 0; i < Map.AdornmentOverlay.Layers.Count; i++)

            {

                if ((Map.AdornmentOverlay.Layers.Name != "Legend") || (LegendInMap.EditValue.ToString() != "Nunca"))

                {

                    Map.AdornmentOverlay.Layers.Open();

                    Map.AdornmentOverlay.Layers.Draw(pdfGeoCanvas, labelsInLayers);

                    Map.AdornmentOverlay.Layers.Close();

                    pdfGeoCanvas.Flush();

                }

            }


 



Mauro, 
  
 Thanks for your sample code, I have tried to reproduce your problem, but it seems your code can not works, could you check your code or provide a compiled product as attachement? I will appreiate your help. 
  
 Thanks 
 James 


James, 
  
 I created a sampl application and tryied to upload it here, but I got a server error. So, I sent to support@thinkgeo.com asking them to forward it to you. 
  
 Cheers, 
  
 Mauro

Mauro, 
  
 I will ask our support to forward your sample code to me, and then test to find out the problem. 
  
 Thanks 
 James

Mauro,


Thanks for your sample code that I can reproduce your problem to help me fix it.


There are two places I did update, the first one is change != to ==, I think that's just a mistake when you extract sample code to me.


Another one is the place which fix your problem, at DrawCore of LegendAdornmentLayer, you only consider the GdiPlusGeoCanvas, so display map is Ok because it uses GdiPlusGeoCanvas, however when you print it by PrintGeoCanvas, it's not GdiplusGeoCanvas, so it ignore some shapes, I just add the following code to fix it, to make it better you can modify :


                    else
                    {
                        System.IO.MemoryStream stream = new System.IO.MemoryStream();
                        legendBitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
                        canvas.DrawScreenImageWithoutScaling(new GeoImage(stream), themeIndent + xOffset, yOffset + layerRectangle.Height / 2, DrawingLevel.LevelOne, 0, 0, 0);
                    }

Thanks


James


 



Hi James, tks, we are almost there now.


I changed a bit the code you sent me in a way the legend looks like I need. It basically add a new color box close to the legend name. Please, compare the results in map control and the pdf file. For example, in the PDF there´s a black border around the color boxes that doesn´t exists in the map control legend.


I sent back to you the code I changed, please take a look.


Thanks again,


Mauro



Mauro, 
  
 I compare the results in map control and the pdf file, I see the black border boxes, the reason is that the image to draw is not transparent because the code using BMP image type, you can switch it to PNG to solve the problem. 
 change System.Drawing.Imaging.ImageFormat.Bmp to System.Drawing.Imaging.ImageFormat.Png 
  
 Thanks 
 James

Perfect, James, thanks a lot!

Mauro, 
  
 You’re welcome, I am glad it’s working with you. 
  
 Just let me know if you have more questions. 
 Thanks 
  
 James