printout_1

printout_2

のような感じの印刷画面を作成します。

印刷プレビューでは見にくいですがTablrViewの行番号をオレンジのPinに貼り付けてあります。

ザックリとした概要は、

印刷画面はWebViewでつくる

です。
手順は、
1.表示中のMapViewを
MKMapSnapshotOptions()->MKMapSnapshotter()
でimage化する

2.ピンをセッティングして番号と一緒に描画する。

3.完成したimageを一旦、ファイル保存する。

4.WebViewに表示するhtml を作成する

5.WebViewを印刷UIに設定する

1.表示中のMapViewをimage化する

let PRINT_MapWidth = 1000.0 //A4 144dpi
let PRINT_MapHeight = 500.0

let center = self.addrLocation //地図のcenterのCLLocationCoordinate2D です
var options = MKMapSnapshotOptions()

//表示範囲 数値が小さくなるほど表示される領域は狭くなります。(つまり、ズームレベルが高くなる)
let span = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)
options.region = MKCoordinateRegion(center: center, span: span)

options.scale = self.mapVw.contentScaleFactor
options.size = CGSize(width: PRINT_MapWidth, height: PRINT_MapHeight) //pngFileのサイズ設定

let snapshotter = MKMapSnapshotter(options: options)
snapshotter.startWithCompletionHandler({(snapshot, error) in    // <------ ※
  if error != nil {
     print("******* Error return !!-- startWithCompletionHandler()")
     return
  }

2.Pinのannotationsを走査して、CustomMKPointAnnotationからオレンジ色のPinを検索しtableView番号と一緒にPinを表示する

let image = snapshot!.image

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Context 開始(1) --- 一番大きい画像サイズでContextを開く
UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale)

//① Contextに地図を描画する
image.drawAtPoint(CGPoint(x: 0.0, y: 0.0))

//② Pinのannotationsを走査
for anno in self.mapVw.annotations {
  if let annotation = anno as? CustomMKPointAnnotation {
      let annotationView = MKPinAnnotationView(annotation: nil, reuseIdentifier: "Pin")
      annotationView.pinTintColor = annotation.pinColor
      let pinImage = annotationView.image
       
       // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Context 開始(2) ---- PinのContextを開く
       UIGraphicsBeginImageContext(pinImage!.size)  

       //PinImageのカスタマ
       let font = UIFont.boldSystemFontOfSize(12)
       let imagePinWidth = pinImage!.size.width
       let imagePinHeight = pinImage!.size.height
       
    // 描画領域を生成
       let pinrect = CGRectMake(0, 0, imagePinWidth, imagePinHeight)
       
    pinImage!.drawInRect(pinrect)
       
    // テキストの描画領域
       let textRect  = CGRectMake(0, 0, imagePinWidth/2, imagePinHeight/2)
       let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy(
       let textFontAttributes = [
           NSFontAttributeName: font,
           NSForegroundColorAttributeName: UIColor.blackColor(),
           NSParagraphStyleAttributeName: textStyle
       ]
    
        if annotation.pinColor == UIColor.orangeColor() {
           //Table行位置の取得 ..getPinAnnoToRow()はTableViewの表示データListから該当行数を取ってきます。
           let row = self.getPinAnnoToRow(anno) + 1
           let numstr = row < 10 ? String(format: " %d", row) : row.description;
           let text = numstr
    
           // テキストをdrawInRectメソッドでレンダリング
           text.drawInRect(textRect, withAttributes: textFontAttributes)
         }
         // Context に描画された画像を新しく設定
         let newImage = UIGraphicsGetImageFromCurrentImageContext();
         // Context(2) 終了
         UIGraphicsEndImageContext()
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     
     var point = snapshot!.pointForCoordinate(annotation.coordinate)
     let pinCenterOffset = annotationView.centerOffset
     point.x -= annotationView.bounds.size.width / 2.0
     point.y -= annotationView.bounds.size.height / 2.0
     point.x += pinCenterOffset.x
     point.y += pinCenterOffset.y
        newImage!.drawAtPoint(point)
   }
}

//Pinを表示した最終的なmapViewのImageの取得
let finalImage = UIGraphicsGetImageFromCurrentImageContext()
// Context(1)の 終了
UIGraphicsEndImageContext()
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3.webviewでの表示用に最終的なmapViewのImageをキャッシュに保存する

let pngname = "hogehoge_??????.png" //毎回ユニークなfile名にする
let pngpath = TotnImage.savePingFileToCaches(finalImage, pngname)

Imageをキャッシュに保存するhelper関数

struct TotnImage {
    static func savePingFileToCaches( image:UIImage,_ filename:String)->String{
        let data :NSData? = UIImagePNGRepresentation(image);
        let filePath = String( format:"%@/%@", NSHomeDirectory().stringByAppendingString("/Library/Caches"),filename)
        print("filePath; \(filePath)");
        
        // 保存処理
        if  ((data?.writeToFile(filePath,atomically: true)) != nil){
            return filePath
        }
        else {
            return ""
        }
    }
}

4. webviewの表示用のhtmlの概要

if pngpath.isEmpty == false {
  var htmStr:String = ""
 //1.お約束のhtmlのヘッダの設定
  //2. 保存した地図fileの指定
  htmStr +=  "<img src=" + pngname + "/>"
  //3.TableViewのデータを表形式で表示する
 htmStr += "</html>  </body>"   //HTML EOF

 //WebViewキャッシュのクリア
 NSURLCache.sharedURLCache().removeAllCachedResponses()
 
 //image fileの在り処
 let documentDirectoryURL =  try! NSFileManager().URLForDirectory(.CachesDirectory,
              inDomain: .UserDomainMask,
     appropriateForURL: nil,
                create: true)

  //キャッシュをクリアする必要がある
  let request = NSURLRequest(URL: documentDirectoryURL,
                    cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData,
                timeoutInterval: 0.01)

  // 重要!! htm文字列とImg参照用のbaseURLを指定する
  webview.loadHTMLString(htmStr, baseURL:documentDirectoryURL)

}

4.最後に、UIPrintInfo と UIPrintInteractionController の設定

         let pi = UIPrintInfo(dictionary: nil)
         pi.outputType = UIPrintInfoOutputType.General
         pi.jobName = "print Job"
         pi.orientation = UIPrintInfoOrientation.Portrait
         pi.duplex = UIPrintInfoDuplex.LongEdge
         
         let pic = UIPrintInteractionController.sharedPrintController()
         pic.printInfo = pi
         let formatter2 = webview.viewPrintFormatter();
         pic.printFormatter = formatter2
         pic.presentAnimated(true, completionHandler: nil)
         
     }
 })   // <------ ※のブロックエンド

のような感じになります。
お疲れ様でした。