ThinkGeo.com    |     Documentation    |     Premium Support

MapPrinterLayer not printing to scale

Hi,


I have been working with the print preview system quite a bit latlely and as part of my testing I have been trying to set the MapPrinterLayer to a particular scale and then verify that the scale is correct after printing. I created a feature that is exactly one mile square and set the scale to 15840 (1320 ft/in). At that setting the one mile square polygon should measure exactly 4 inches per side. What I noticed is that it actually measures about 3 7/8 inches per side. This is extremely close, and I can't help but think a little tweaking would get it exact. Would it be possible to correct this very small error?


I have attached a sample project so you can see how I have been testing.


Thanks!


 


 



Hello Steven, 
  
 Thanks for your post and sample, we have recreate this problem, our product team is working on this now, I will post the result here as soon as they fix the bug. 
  
 Regards, 
  
 Gary

Hi guys, 



It looks like this is still an issue. When I print out a box that should measure 4 inches on a side it is still a little less than 4 inches. Any chance of a fix for this issue in the near future? 



Thanks! 



Steve


Hi Steven,

We have found out the reason and it proved it is not a bug but related with the DefaultPageSettings of the Printer.

We can compare the Microsoft XPS Document Writer with a default printer which here is HP PCL5. 


After we print the document with the two printers. We found the XPS can always print the expect result(no matter on PC or Print it on paper) and the printed paper from HP PCL5 can always get the “incorrect” result like you said, each side is only about 3 7/8 Inches and the scale bar is also less 2 inches, which seems like the drawing area is compressed. 


Then we find out the different setting on the DefaultPageSetting between the two printers.

XPS:


HP PCL5:


From the above images, we can see the Printable Area from HP PCL5 is smaller than the XPS and that result the whole map was compressed a little. 


Now, here is a workaround to change the PaperSize of the defaultPageSetting.


Modify the line 153 from 

.DefaultPageSettings.PaperSize = New PaperSize("AnsiA", 850, 1100)

To

.DefaultPageSettings.PaperSize = New PaperSize("AnsiA", 900, 1140)

This size can make sure the printable area is enough to contain the content without a compression. 



Sorry we misunderstand this issue and thanks for your sample to help us to recreate it easily.



Thanks



Summer









Hi Summer, 
  
 Thanks for the reply! I have not tested your fix yet, but I have no doubt it will work for 8.5 X 11 paper. It looks like another setting on the HPPCL5 is different. HardMarginX and HardMarginY are both 0.0 for the XPS and are 25.0 and 16.0 for the HPPCL5. Changing those values might also fix the issue.  
  
 Our application must be able to print correct scale to many different paper sizes and devices, including plotters. We need a solution that allows us to make the proper adjustment for each device. We might be able to come up with a solution simply by examining the properties of each device before printing to discover its properties, then make the adjustment. 
  
 I think we can figure it out. But how did you open the properties for the printers you are using? I cannot find a property page similar to that for my printer (HP C7200)? 
  
 Thanks! 
  
 Steve

Hi Steven,


Currently our office doesn't have HP C7200 to test. But We did a quick watch at  oPrinterSettings  around the line 138 “Dim oPrinterSettings As PrinterSettings = GetPrinter()”, and then we should be able  got the similar printer result like above.   


Public Function GetPrinter() As PrinterSettings

      Dim oPrintDialog As New PrintDialog

      Dim oPrinterSettings As PrinterSettings = Nothing


      With oPrintDialog

         If Not .ShowDialog() = DialogResult.Cancel Then

            oPrinterSettings = .PrinterSettings

         End If

      End With

      Return oPrinterSettings

   End Function


Another thing I noticed is that the sample “ScaleBarTest.zip” you attached now is missing at this page, and it should be a mistake when upgrading on our website.  So, here I attached it for your convenience.


Hope it helps


Summer



005_004_003_002_001_ScaleBarTest.zip (54.3 KB)

Hi Summer,



Thanks for you reply and also thanks for the sample project in the attachment. The solution of increasing the page dimensions solves the problem of scale but creates a new problem for me. When I use that solution all PrinterLayer objects shift to the right by the amount of HardMarginX, in my case 0.13 inches. The also shift down by the amount of HardMarginY.



My workaround is to create the RectangleShape that represents the drawing area using the original page size (850 X 1100 in this case). I then shift all the printer layers to the left by HardMarginX and up by  HardMarginY before printing. Following the print, the PrinterLayers are returned to their original positions.



In this way I am hopeful all printer devices will produce the desired results. Here is the code I am using.




01.Dim oPrintDocument As New PrintDocument()
02.With oPrintDocument
03.   .PrinterSettings = oPrinterSettings
04.   .DefaultPageSettings.Landscape = True
05.   If oPagePrinterLayer.Orientation = PrinterOrientation.Portrait Then
06.      .DefaultPageSettings.Landscape = False
07.   End If
08.   .DefaultPageSettings.PaperSize = New PaperSize(“AnsiA”CInt(850), CInt(1100))
09.End With
10. 
11.Dim oRect As RectangleShape
12.Dim oNewUpperLeft As PointShape
13.Dim oNewLowerRight As PointShape
14.Dim oNewRect As RectangleShape
15. 
16.Dim oPrinterCanvas As PrinterGeoCanvas = New PrinterGeoCanvas()
17. 
18.’***** Create a rectangle to represent the drawing area for the document
19.oPrinterCanvas.DrawingArea = New Rectangle(0, 0, 850, 1100)
20. 
21.’***** Start the drawing process
22.oPrinterCanvas.BeginDrawing(oPrintDocument, oPagePrinterLayer.GetBoundingBox(), PageLayout.MapUnit)
23. 
24.’***** Loop through all of the PrintingLayers in the PrinterInteractiveOverlay 
25.’***** and print all of the except for the PagePrinterLayer                
26.Dim labelsInAllLayers As Collection(Of SimpleCandidate) = New Collection(Of SimpleCandidate)()
27.For Each oPrinterLayer As PrinterLayer In oPrinterOverLay.PrinterLayers
28.   oPrinterLayer.IsDrawing = True
29.   If Not (TypeOf oPrinterLayer Is PagePrinterLayer) Then
30.      oPrinterLayer.Open()
31.      '***** Shift the PrinterLayer to the right and up by HardMarginX and HardMarginY
32.      oRect = (oPrinterLayer.GetPosition(PrintingUnit.Inch))
33.      oNewUpperLeft = New PointShape(oRect.UpperLeftPoint.X - 0.13, oRect.UpperLeftPoint.Y + 0.06)
34.      oNewLowerRight = New PointShape(oRect.LowerRightPoint.X - 0.13, oRect.LowerRightPoint.Y + 0.06)
35.      oNewRect = (New RectangleShape(oNewUpperLeft, oNewLowerRight))
36.      oPrinterLayer.SetPosition(oNewRect, PrintingUnit.Inch)
37.      oPrinterLayer.Draw(oPrinterCanvas, labelsInAllLayers)
38.      oPrinterLayer.SetPosition(oRect, PrintingUnit.Inch)
39.   End If
40.   oPrinterLayer.IsDrawing = False
41.Next oPrinterLayer
42. 
43.oPrinterCanvas.EndDrawing()

This seems to be getting the job done for me.



Thanks,



Steve



 

Hi Steven, 
  
 Your workaround also works at our printer. But we switch to the other printer like XPS, The shift problem is still there. So I am thinking if we set the offset based on the printer HardMarginX/Y rather the hardcoded value like  0.13 inches for x and 0.06 inches for y. 
  
 Hope it works. 
  
 Summer 


Summer, 



Yes, my code example was for illustration purposes. In actual practice I use HardMarginX where you see 0.13 and HardMarginY where you see 0.06. You have to remember to divide HardMarginX/Y by 100 to get the correct number, since they are returned in units of 1/100 inch. Of course the same is true when setting up the DrawingArea on the PrinterGeoCanvas, I use the actual paper dimensions instead of hard coding 850 and 1100. 



Thanks for your help! 



Steve

Hi Steve, 
  
 Thanks for your share, your reply is very helpful for solve this problem if someone else met this problem. 
  
 Regards, 
  
 Don