ThinkGeo.com    |     Documentation    |     Premium Support

PDFSharp Extenstion Issues 2

More scaling and extent issues in PdfSharp.


As per the example code we create a drawing area and then use the extent helper to create a new extent based on out original maps extent and the new drawing area. however the extent returned is the same as the original map extent!


 


Please see my code below 


 



PdfGeoCanvas pdfGeoCanvas = new PdfGeoCanvas(); 
pdfGeoCanvas.DrawingArea = new System.Drawing.Rectangle( (int)_Margin + 10, (int)_Margin + 10, (int)(page.Width.Point - (2 * _Margin) - _LandscapeMargin) - 10 - 10, (int)(page.Height.Point - (2 * _Margin) - 10 - 10)); 
RectangleShape extent = ExtentHelper.GetDrawingExtent(map.CurrentExtent, pdfGeoCanvas.DrawingArea.Width, pdfGeoCanvas.DrawingArea.Height); 

Map.CurrentExtent and  extent always return the same value. This is problematic as I'm busy creating cordinate outputs on my print and they are scaled based on the original scale of my map and not what the new extent should be.



Jeremy, 
  
 Could you tell me how do you implement the printing? Using callback or Postback? If it’s the first way, the current extent won’t be synchronized between client and server side. 
  
 Please give us more information. 
  
 Thanks, 
 Howard

I have quite a complicated system in place so I can't easily provide my code. but as per your pdfsharp example I have an asp button that initiates the print. So I'm using it on postback. 



My point is that I can get the current. The current extent is correct, however because the map is now being output to a larger canvas size in the pdf document the extent will have to change. So I'm using as per the example the ExtentHelper to calculate the new extent. 



RectangleShape extent = ExtentHelper.GetDrawingExtent(map.CurrentExtent, pdfGeoCanvas.DrawingArea.Width, pdfGeoCanvas.DrawingArea.Height); 



however event though I'm passing in the map extent (accurately) and the new canvas width and height, The output extent is still reading the same as the input extent. The reason that this is wrong is because when we ouput the map to pdf the map doesn't rescale, its drawing area is merely enlarged or shrunk i.e. the extent actually gets changed and NOT the scale (which is a whole other issue I have).


As you will see in my map The square is was my display area on screen. the rest of it is whats printed when the canvas was resized. However along the borders I have the long and lat coordinates. These coordinates are wrong because I cant get the new extent for the new drawing area.  so where is has the long as 30 degrees at the end. the 30 degrees is actually where my red square ends. Event though my calculation is performed on the output of the ExtentHelper and not the input.



939-MyPDF_copy.jpg (51.8 KB)

Jeremy, 


The method GetDrawingExtent() will modify the given Extent based on the ratio of the Map’s Width and Height, it is not simply enlarge/shrink the canvas but it will modify the scale for most cases to get the smallest rectangle containing the given extent. Here is a sample how it works:
 
Let’s say the current extent is a 10 * 10 rectangle, and the ratio between the Width and Height of the Canvas is 2:1, then after calling the method GetDrawingExtent(), we will probably get the picture on the right. You can see the new extent is the smallest rectangle which includes the original one. Note that the scale will change based on the size of the new canvas.

Instead, if you want to keep the scale but just enlarge the canvas, what you need to do is to proportionally enlarge the extent based on the Canvas’s size. For example if the original canvas is 100 * 100, and the current extent is 20 * 20, if you want to keep the same scale but draw it on a bigger canvas like 200 * 200,  then you need to relatively change your current extent to 40 * 40. For most cases you might want to enlarge the extent based on the same center point but of course you can also base on the same UpperLeft point if you want.


As a result, I don’t think GetDrawingExtent is for your case. You should modify your current extent according to the sizes of pdfGeoCanvas and draw the PDF using that extent.


 
Hope that helps! Let me know if you have more issues.
 
Thanks,
 
Ben

 



Understood. 
  
 Thats only part of the problem though. I know my pdf extent and original map extent are different. However the extent helper still returns the same resultant extent.

Jeremy, 
  
 Just wonder is the ratio of the Canvas’ Width and Height the same with the ratio of the Extent’s Width and Height. If the 2 ratios are the same, the return extent will be the same as the input extent.  Could you let me know the arguments in the GetDrawingExtent method? 
  
 Thanks, 
  
 Ben

Ok I have dropped the ExtentHelper idea completely.  
  
 Thanks for the help. I still think there is an issue with it as I know that my canvases width:height ratio are different, and yet I still get the same results. But I’m just going to recalculate it myself. 
  
 Thanks for the assist.

Jeremy, 
  
 We will keep investigating this. If that’s convenient, can you let me know the width and height of your Canvas and the input (currentExtent, width and height) of the GetDrawingExtent() method, we will try to recreate this issue here. Thanks in advance :) 
  
 Ben

ok, my map was 640x480. As for the pdf canvas extent, well it dependent on the page size. I always have a margin around the page of 0.5 inches, however I have a data sections which is always 1.5 inches. This sits on the right or the bottom of the page depending on the page orientation. 
  
 landscape left, portrait right. 
  
 because of these settings, my drawing x / y ratio varies greatly depending on whether its an A4 page or an A0 page.

Jeremy, 
  
 Thanks for the information. I think it is similiar to one of your other posts, we will focus on that one. 
  
 Thanks, 
  
 Ben