質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1737閲覧

AirPrintでアプリ内で作ったPDFを印刷したのですが、A4よりはるかに小さいサイズで印刷された

mimamo

総合スコア44

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/01/25 12:13

編集2019/01/25 12:18

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

赤色と緑色のUIImageViewのサイズをそれぞれA5サイズにしたく、storyboardで大きさを(148,210)
としていましたがここが上手くいかない原因でした。

148mm×210mm(A5サイズ)なので大きさを(148,210)としていましたが、storyboardの単位がptでした。
ptに変換することで無事A4サイズに印刷することができました。

投稿2019/01/30 14:10

mimamo

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Objective-Cで古いですが、参考になる日本語サイト
http://www.xcode-objc.jp/pdf%E3%82%92%E4%BD%9C%E3%82%8B%E5%8D%B0%E5%88%B7%E3%81%99%E3%82%8B/

英語のサイトでは
https://stackoverflow.com/questions/35766111/print-pdf-in-a5-size-in-landscape

いずれも違う方法で書いてありますが、
そこらへんを試してみれば、期待の結果が得られるのではないでしょうか?

投稿2019/01/25 16:09

hameji001

総合スコア639

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimamo

2019/01/26 04:35

ご回答ありがとうございます! 今実機がないのですぐには試せないのですが後ほどやってみます!
mimamo

2019/01/29 06:16

頂いた資料を参考に実際に印刷してみました。 UIGraphicsBeginPDFContextToData(data, CGRect(x: 0, y: 0, width: 792, height: 612), nil) (英文の参考資料) を追加すると、画面で表示したいPDFが変わってしまったのでUIGraphicsBeginPDFPageWithInfo(CGRectMake(0,0,612,792),nil); を参考にしてやってみることにしました。 class PhotoT の  関数createTougouPdfで下記のようにUIGraphicsBeginPDFPageWithInfo(CGRect(x:0,y:0,width:612,height:792),nil)を追加してみたのですが、印刷されたものは以前と同じでした。 func createTougouPdf(){ let x = tensen.frame.origin.x let y = tensen.frame.origin.y UserDefaults.standard.set(y, forKey: "uekaranokyori") //UIImageView(getimage)のサイズ取得 let imageWidth = self.tensen.frame.width let imageHeight = self.tensen.frame.height let pdfData = NSMutableData() //コードの追加 UIGraphicsBeginPDFPageWithInfo(CGRect(x:0,y:0,width:612,height:792),nil) //どんな大きさ、位置のものを表示するのか UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: x, y: -y, width: imageWidth, height: imageHeight), nil) UIGraphicsBeginPDFPage() guard let pdfContext = UIGraphicsGetCurrentContext() else { return } self.view.layer.render(in: pdfContext) UIGraphicsEndPDFContext() if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { let documentsFileName = documentDirectories + "/tougou.pdf" //パスを保存して次の画面で表示させる UserDefaults.standard.set(documentsFileName, forKey:"TougouPath") debugPrint(documentsFileName) pdfData.write(toFile: documentsFileName, atomically: true) } } PDF(tougou.pdf)のサイズをA4にできたらA4サイズで印刷されると思っているのですが、このコードだけでは不十分ということでしょうか、、 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問