Have you tried a more WYSIWYG approach? Try using the MM_ANISOTROPIC mapping mode as it makes it easier to match your view and print output using the same OnDraw code. Here's a quick sample to plop into a new CScrollView doc/view app to see if the results are consistent on your printers. Keep in mind that it's more important to preserve aspect ratio, keeping everything proportional, and ensuring no drawing code falls outside the printable area. You will find small variances in the metric accuracy on all printers so focus more on the relative placement and you'll suffer less print anxiety. //CDocument members... // Header file .h protected: CSize m_DocSize; // Implementation file .cpp CSize CYourDoc::GetDocSize() const { return m_DocSize; } CYourDoc::CYourDoc() { // TODO: add one-time construction code here m_DocSize=CSize(2000,2800); } //CScrollView members... // Header file .h private: int m_nPage; // Implementation file .cpp CYourView::CYourView() { // TODO: add construction code here SetScrollSizes(MM_TEXT,CSize(0,0)); // Set arbitrary values m_nPage=1; } /*************************************** NOTE: The pInfo parameter is uncommented ****************************************/ void CYourView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* pInfo) { // TODO: add extra initialization before printing pInfo->SetMaxPage(3); } void CYourView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { // TODO: Add your specialized code here and/or call the base class m_nPage=pInfo->m_nCurPage; CScrollView::OnPrint(pDC, pInfo); } void CYourView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) { CScrollView::OnPrepareDC(pDC); // TODO: Add your specialized code here and/or call the base class // Set up the DC for the current scale factor int nExtentX; int nExtentY; CSize sizeDoc; CRect rectClient; pDC->SetMapMode(MM_ISOTROPIC); // Get pertinent rectangle data GetClientRect(&rectClient); sizeDoc=GetDocument()->GetDocSize(); sizeDoc.cy=(-sizeDoc.cy); // Y goes down as it increments pDC->SetWindowExt(sizeDoc); // Window extent is size of document // Calculate viewport extent nExtentX=rectClient.Width(); nExtentY=(int)((nExtentX*sizeDoc.cy)/(sizeDoc.cx)); // What kind of device context do we have? if (pDC->IsPrinting()==TRUE) { pDC->SetViewportExt(pDC->GetDeviceCaps(HORZRES),-pDC->GetDeviceCaps(VERTRES)); } else { // Context is for