前提・実現したいこと
A4用紙にできる限りいっぱいにプリントしたいです。
アプリ内で画像(PDFをUIImageViewで表示)と画像(PDFをUIImageViewで表示)をくっつけてひとつのPDFにしたものを、AirPrintで印刷してみたのですが、真ん中に小さく(A4の1/9サイズくらい)プリントされるだけでした。
赤色のUIImageViewはアプリ内で作ったPDFを表示させ、
緑色のUIImageViewはプロジェクトにあらかじめ取り込んだPDFを表示させています。
赤色と緑色のUIImageViewのサイズは(148,210)です。
赤色と緑色のUIImageViewを合わせるとA4サイズになるようにしてあります。
また、赤色と緑色のUIImageViewがおさまるUIImageView(tensen)をstoryboard上で設置しています。
どのようにすれば、できる限りA4用紙いっぱいに印刷されるのかがわかりませんでした。
ご教授よろしくお願いいたします。
該当のソースコード
赤色のUIImageViewに表示するPDFを保存するコード
swift
1 static let safeAreaBottomInset: CGFloat = { 2 if #available(iOS 11.0, *) { 3 return UIApplication.shared.keyWindow?.rootViewController?.view.safeAreaInsets.bottom ?? 0 4 } else { 5 return 0 6 } 7 }() 8 @IBOutlet weak var getimage: UIImageView! 9 // ステータスバーの高さを取得する 10 let statusBarHeight = UIApplication.shared.statusBarFrame.size.height 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 // Screen Size の取得 15 screenWidth = self.view.bounds.width 16 screenHeight = self.view.bounds.height 17 18 //出来るだけ画面いっぱいに表示する 19 let imageHeight = screenWidth * 210 / 148 20 let imagerect:CGRect = CGRect(x:0, y:0, width:screenWidth, height:imageHeight) 21 22 // ImageView frame をCGRectで作った矩形に合わせる 23 getimage.frame = imagerect; 24 25 // 画像の中心をスクリーンのほぼ中心位置に設定 26 getimage.center = CGPoint(x:screenWidth/2, y:(screenHeight-statusBarHeight-88-ViewController2.safeAreaBottomInset)/2+statusBarHeight+44) 27 28 //ステータスバーの高さが20pt 29 //Navigationbar,toolbarの高さは44ptらしい 30 31 32 // view に ImageView を追加する 33 self.view.addSubview(getimage) 34 } 35 36 @IBAction func push(_ sender: Any) { 37 print("push") 38 39 40 let x = getimage.frame.origin.x 41 let y = getimage.frame.origin.y 42 UserDefaults.standard.set(y, forKey: "uekaranokyori") 43 44 //UIImageView(getimage)のサイズ取得 45 let imageWidth = self.getimage.frame.width 46 let imageHeight = self.getimage.frame.height 47 48 49 let pdfData = NSMutableData() 50 //どんな大きさ、位置のものを表示するのか 51 UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: x, y: -y, width: imageWidth, height: imageHeight), nil) 52 UIGraphicsBeginPDFPage() 53 54 guard let pdfContext = UIGraphicsGetCurrentContext() else { return } 55 self.view.layer.render(in: pdfContext) 56 UIGraphicsEndPDFContext() 57 58 if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { 59 let documentsFileName = documentDirectories + "/test.pdf" 60 //パスを保存して次の画面で表示させる 61 UserDefaults.standard.set(documentsFileName, forKey:"filePath") 62 debugPrint(documentsFileName) 63 pdfData.write(toFile: documentsFileName, atomically: true) 64 } 65 66 } 67
赤色と緑色のUIImageViewにそれぞれPDFを表示させる
↓
ひとつのPDFとして保存する
↓
PDFを表示
↓
印刷
swift
1 2import UIKit 3import PDFKit 4 5class PhotoT: UIViewController { 6 7 @IBOutlet weak var pdfView: PDFView! 8 var ActivityIndicator: UIActivityIndicatorView! 9 10 11///A5+A5 12 13 @IBOutlet weak var left: UIImageView! 14 @IBOutlet weak var right: UIImageView! 15 @IBOutlet weak var tensen: UIImageView! 16 @IBOutlet weak var pdfyou: UIView! 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 21 22 23 24 25 // プロジェクトにあらかじめ取り込んでおいたPDFの読み込み (右側に配置したい) 26 let binhoge = UserDefaults.standard.integer(forKey: "selectedTag") 27 let rightpdfName = "huto(binhoge).pdf" 28 let righturl = Bundle.main.bundleURL.appendingPathComponent(rightpdfName) 29 30 print("右側のPDF") 31 32 33 right.image = drawPDFfromURL(url: righturl) 34 35 36 37 38 39 // 作成したローカルPDFの読み込み 40 let filePath0 = UserDefaults.standard.string(forKey:"filePath") 41 let leftpdfURL = URL(fileURLWithPath: filePath0!) 42 43 print("左側のPDF") 44 left.image = leftdrawPDFfromURL(url: leftpdfURL) 45 46 createTougouPdf() 47 48 49 50 ///////PDF表示 51 let pdfView = PDFView(frame: pdfyou.frame) 52 53 54 // 読み込み 55 let tougouPath = UserDefaults.standard.string(forKey:"TougouPath") 56 let pdfURL = URL(fileURLWithPath: tougouPath!) 57 58 59 let document = PDFDocument(url: pdfURL) 60 pdfView.document = document 61 pdfView.backgroundColor = .lightGray 62 63 // PDFの拡大率を調整する 64 pdfView.autoScales = true 65 // 表示モード 66 pdfView.displayMode = .singlePageContinuous 67 68 69 view.addSubview(pdfView) 70 71 72 } 73 74 75 76 func drawPDFfromURL(url: URL) -> UIImage? { 77 78 79 guard let document = CGPDFDocument(url as CFURL) else { return nil } 80 guard let page = document.page(at: 1) else { return nil } 81 82 let pageRect = page.getBoxRect(.mediaBox) 83 let renderer = UIGraphicsImageRenderer(size: pageRect.size) 84 let img = renderer.image { ctx in 85 UIColor.white.set() 86 ctx.fill(pageRect) 87 88 ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height) 89 90 ctx.cgContext.scaleBy(x: 1.0, y: -1.0) 91 92 ctx.cgContext.drawPDFPage(page) 93 } 94 95 return img 96 } 97 98 99 100///くっつけたやつを表示 101 func createTougouPdf(){ 102 let x = tensen.frame.origin.x 103 let y = tensen.frame.origin.y 104 UserDefaults.standard.set(y, forKey: "uekaranokyori") 105 106 //UIImageView(getimage)のサイズ取得 107 let imageWidth = self.tensen.frame.width 108 let imageHeight = self.tensen.frame.height 109 110 111 let pdfData = NSMutableData() 112 //どんな大きさ、位置のものを表示するのか 113 UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: x, y: -y, width: imageWidth, height: imageHeight), nil) 114 UIGraphicsBeginPDFPage() 115 116 guard let pdfContext = UIGraphicsGetCurrentContext() else { return } 117 self.view.layer.render(in: pdfContext) 118 UIGraphicsEndPDFContext() 119 120 if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { 121 let documentsFileName = documentDirectories + "/tougou.pdf" 122 //パスを保存して画面で表示させる 123 UserDefaults.standard.set(documentsFileName, forKey:"TougouPath") 124 debugPrint(documentsFileName) 125 pdfData.write(toFile: documentsFileName, atomically: true) 126 } 127 } 128 129 130 ///////////印刷ボタン 131 @IBAction func startPrint(_ sender: UIButton) { 132 self.showPrinterPicker() 133 } 134 135 136 func showPrinterPicker() { 137 // UIPrinterPickerControllerのインスタンス化 138 let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: nil) 139 140 // UIPrinterPickerControllerをモーダル表示する 141 printerPicker.present(animated: true, completionHandler: 142 { 143 [unowned self] printerPickerController, userDidSelect, error in 144 if (error != nil) { 145 // エラー 146 print("Error : (String(describing: error))") 147 } else { 148 // 選択したUIPrinterを取得する 149 if let printer: UIPrinter = printerPickerController.selectedPrinter { 150 print("Printer's URL : (printer.url)") 151 self.printToPrinter(printer: printer) 152 } else { 153 print("Printer is not selected") 154 } 155 } 156 } 157 ) 158 } 159 160 func printToPrinter(printer: UIPrinter) { 161 // 読み込み 162 let tougouPath = UserDefaults.standard.string(forKey:"TougouPath") 163 let pdfURL = URL(fileURLWithPath: tougouPath!) 164 print("印刷!!") 165 166 // 印刷してみる 167 let printIntaractionController = UIPrintInteractionController.shared 168 let info = UIPrintInfo(dictionary: nil) 169 info.jobName = "TougouSample Print" 170 info.orientation = .portrait 171 printIntaractionController.printInfo = info 172 //印刷する内容 173 printIntaractionController.printingItem = pdfURL 174 printIntaractionController.print(to: printer, completionHandler: { 175 controller, completed, error in 176 }) 177 } 178 179 180 181 182 override func didReceiveMemoryWarning() { 183 super.didReceiveMemoryWarning() 184 // Dispose of any resources that can be recreated. 185 } 186 187} 188
補足情報(FW/ツールのバージョンなど)
赤いUIImageViewの方だけをPDF化して印刷すると160mm×113mmくらいのサイズで印刷されました。
Swiftのversionは4.1.2
Xcodeのversionは9.4.1

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。