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

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

ただいまの
回答率

90.48%

  • Swift

    8919questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 288

mimamo

score 14

前提・実現したいこと

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を保存するコード

    static let safeAreaBottomInset: CGFloat = {
        if #available(iOS 11.0, *) {
            return UIApplication.shared.keyWindow?.rootViewController?.view.safeAreaInsets.bottom ?? 0
        } else {
            return 0
        }
    }()
    @IBOutlet weak var getimage: UIImageView!
    // ステータスバーの高さを取得する
    let statusBarHeight = UIApplication.shared.statusBarFrame.size.height

    override func viewDidLoad() {
        super.viewDidLoad()
        // Screen Size の取得
        screenWidth = self.view.bounds.width
        screenHeight = self.view.bounds.height

       //出来るだけ画面いっぱいに表示する
        let imageHeight = screenWidth * 210 / 148
        let imagerect:CGRect = CGRect(x:0, y:0, width:screenWidth, height:imageHeight)

        // ImageView frame をCGRectで作った矩形に合わせる
        getimage.frame = imagerect;

        // 画像の中心をスクリーンのほぼ中心位置に設定
        getimage.center = CGPoint(x:screenWidth/2, y:(screenHeight-statusBarHeight-88-ViewController2.safeAreaBottomInset)/2+statusBarHeight+44)

            //ステータスバーの高さが20pt
            //Navigationbar,toolbarの高さは44ptらしい


        // view に ImageView を追加する
        self.view.addSubview(getimage)
    }

   @IBAction func push(_ sender: Any) {
        print("push")


        let x = getimage.frame.origin.x
        let y = getimage.frame.origin.y
        UserDefaults.standard.set(y, forKey: "uekaranokyori")

        //UIImageView(getimage)のサイズ取得
        let imageWidth = self.getimage.frame.width
        let imageHeight = self.getimage.frame.height


        let pdfData = NSMutableData()
        //どんな大きさ、位置のものを表示するのか
        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 + "/test.pdf"
            //パスを保存して次の画面で表示させる
            UserDefaults.standard.set(documentsFileName, forKey:"filePath")
            debugPrint(documentsFileName)
            pdfData.write(toFile: documentsFileName, atomically: true)
        }

    }

赤色と緑色のUIImageViewにそれぞれPDFを表示させる

ひとつのPDFとして保存する

PDFを表示

印刷

import UIKit
import PDFKit

class PhotoT: UIViewController {

    @IBOutlet weak var pdfView: PDFView!
    var ActivityIndicator: UIActivityIndicatorView!


///A5+A5

    @IBOutlet weak var left: UIImageView!
    @IBOutlet weak var right: UIImageView!
    @IBOutlet weak var tensen: UIImageView!
    @IBOutlet weak var pdfyou: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()





        // プロジェクトにあらかじめ取り込んでおいたPDFの読み込み (右側に配置したい)
        let binhoge = UserDefaults.standard.integer(forKey: "selectedTag")
        let rightpdfName = "huto\(binhoge).pdf"
        let righturl = Bundle.main.bundleURL.appendingPathComponent(rightpdfName)

        print("右側のPDF")


        right.image = drawPDFfromURL(url: righturl)





        // 作成したローカルPDFの読み込み
        let filePath0 = UserDefaults.standard.string(forKey:"filePath")
        let leftpdfURL = URL(fileURLWithPath: filePath0!)

        print("左側のPDF")
        left.image = leftdrawPDFfromURL(url: leftpdfURL)

        createTougouPdf()



        ///////PDF表示
        let pdfView = PDFView(frame: pdfyou.frame)


        // 読み込み
        let tougouPath = UserDefaults.standard.string(forKey:"TougouPath")
        let pdfURL = URL(fileURLWithPath: tougouPath!)


        let document = PDFDocument(url: pdfURL)
        pdfView.document = document
        pdfView.backgroundColor = .lightGray

        // PDFの拡大率を調整する
        pdfView.autoScales = true
        // 表示モード
        pdfView.displayMode = .singlePageContinuous


        view.addSubview(pdfView)


    }



    func drawPDFfromURL(url: URL) -> UIImage? {


        guard let document = CGPDFDocument(url as CFURL) else { return nil }
        guard let page = document.page(at: 1) else { return nil }

        let pageRect = page.getBoxRect(.mediaBox)
        let renderer = UIGraphicsImageRenderer(size: pageRect.size)
        let img = renderer.image { ctx in
            UIColor.white.set()
            ctx.fill(pageRect)

            ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)

            ctx.cgContext.scaleBy(x: 1.0, y: -1.0)

            ctx.cgContext.drawPDFPage(page)
        }

        return img
    }



///くっつけたやつを表示
    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()
    //どんな大きさ、位置のものを表示するのか
    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)
    }
    }


 ///////////印刷ボタン
    @IBAction func startPrint(_ sender: UIButton) {
        self.showPrinterPicker()
    }


    func showPrinterPicker() {
        // UIPrinterPickerControllerのインスタンス化
        let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: nil)

        // UIPrinterPickerControllerをモーダル表示する
        printerPicker.present(animated: true, completionHandler:
            {
                [unowned self] printerPickerController, userDidSelect, error in
                if (error != nil) {
                    // エラー
                    print("Error : \(String(describing: error))")
                } else {
                    // 選択したUIPrinterを取得する
                    if let printer: UIPrinter = printerPickerController.selectedPrinter {
                        print("Printer's URL : \(printer.url)")
                        self.printToPrinter(printer: printer)
                    } else {
                        print("Printer is not selected")
                    }
                }
            }
        )
    }

    func printToPrinter(printer: UIPrinter) {
        // 読み込み
        let tougouPath = UserDefaults.standard.string(forKey:"TougouPath")
        let pdfURL = URL(fileURLWithPath: tougouPath!)
        print("印刷!!")

        // 印刷してみる
        let printIntaractionController = UIPrintInteractionController.shared
        let info = UIPrintInfo(dictionary: nil)
        info.jobName = "TougouSample Print"
        info.orientation = .portrait
        printIntaractionController.printInfo = info
        //印刷する内容
        printIntaractionController.printingItem = pdfURL
        printIntaractionController.print(to: printer, completionHandler: {
            controller, completed, error in
        })
    }




    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

補足情報(FW/ツールのバージョンなど)

赤いUIImageViewの方だけをPDF化して印刷すると160mm×113mmくらいのサイズで印刷されました。

Swiftのversionは4.1.2
Xcodeのversionは9.4.1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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/26 13:35

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

    キャンセル

  • 2019/01/29 15: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サイズで印刷されると思っているのですが、このコードだけでは不十分ということでしょうか、、

    よろしくお願いいたします。

    キャンセル

check解決した方法

-1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Swift

    8919questions

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

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