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

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

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

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

Q&A

解決済

2回答

571閲覧

UIImageViewを特定のサイズでPDF保存する方法

mimamo

総合スコア44

Swift

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

0グッド

0クリップ

投稿2019/01/01 09:30

編集2019/01/08 15:00

前提・実現したいこと

黄色のUIImageView(ピンクのUIImageVIew含む)をPDFとしてアプリ上で作成し、次のプレビュー画面で表示させたいと思っています。
いろいろなサイトを見たのですが、理解ができず進めません。
ご教授、サンプルコードなどありましたらよろしくお願いします。

イメージ説明

pdfを作成するVC↓

swift

1 // UserDefaults のインスタンス 2 let userDefaults = UserDefaults.standard 3 4 func createPdfFromView(aView: UIView, saveToDocumentsWithFileName fileName: String) 5 { 6 print("プレビュー画面作成開始") 7 let pdfData = NSMutableData() 8 UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil) 9 UIGraphicsBeginPDFPage() 10 11 guard let pdfContext = UIGraphicsGetCurrentContext() else { return } 12 13 aView.layer.render(in: pdfContext) 14 UIGraphicsEndPDFContext() 15 16 if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { 17 let documentsFileName = documentDirectories + "/" + fileName 18 debugPrint(documentsFileName) 19 pdfData.write(toFile: documentsFileName, atomically: true) 20 print("プレビュー作成おわり") 21 // 保存 22 UserDefaults.standard.set(documentsFileName, forKey:"filePath") 23 24 } 25 } 26 27 28 29 @IBAction func preView(_ sender: UIButton) { 30 31 createPdfFromView(aView: canvasView, saveToDocumentsWithFileName: "test") 32 33 } 34

pdfを表示するVC

swift

1import UIKit 2import PDFKit 3 4class ViewController3: UIViewController { 5 6 @IBOutlet weak var pdfView: PDFView! 7 8 9 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 15 let pdfView = PDFView(frame: view.frame) 16 17 18 // 読み込み 19 let Path = UserDefaults.standard.string(forKey:"filePath") 20 let pdfURL = URL(fileURLWithPath: Path) 21 22 23 let document = PDFDocument(url: pdfURL) 24 pdfView.document = document 25 pdfView.backgroundColor = .lightGray 26 27 // PDFの拡大率を調整する 28 pdfView.autoScales = true 29 // 表示モード 30 pdfView.displayMode = .singlePageContinuous 31 32 view.addSubview(pdfView) 33 34 } 35}

###エラー該当箇所

class AppDelegate: UIResponder, UIApplicationDelegate{

Thread 1: signal SIGABRT

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

Swiftのversionは4.1.2
Xcodeのversionは9.4.1

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

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

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

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

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

guest

回答2

0

イメージ説明
イメージ説明

自分が、やってみたら、普通にできましたけど、、、
黄色いviewがviewAです。

保存するものをviewA.boundsに変えたら、
下記のものが保存されました。
NavigationBarがあるためか、位置が多少ずれていますが、
微調整すれば何とかなりそうですよ。
storyboardのviewが並んでる順番が大事だと思います。

投稿2019/01/09 06:41

編集2019/01/09 06:42
hameji001

総合スコア639

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

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

mimamo

2019/01/10 04:21

コードの、変更該当箇所ではないviewのところまで変更していました...。 無事できました!ありがとうございます。 余白もなんとか消すことができました! とても丁寧に回答してくださりありがとうございます。感謝の気持ちでいっぱいです。本当に助かりました!
guest

0

ベストアンサー

https://teratail.com/questions/89459

これが参考になりませんか???

と書きましたが、自分でやってみると、上記は理解できませんでした(笑)
作ってみると、下記が参考になりました。
https://code.i-harness.com/ja/q/530e5e
ほぼ、コードはそのままです。
出力するものだけ変更した気がします。

iPhoneをiTunesに接続し、Documentsの中を確認して、
ちゃんと出力されていることを確認しました。

また、コンソールにファイルのパスがprintされていると思うので、
それをuserdefaultsにstringとして一旦格納し、保存。
表示ページではそのパスを読み込んで表示させるようにすればきちんと表示されましたよ。

ちなみにmimamoさんのファイルのパス、ファイル名からして保存、読み出しでズレてますよ。
それではいくらコードが合ってても表示されないですね。

教えておきながらですが、
https://qiita.com/morimorim/items/301cd85f83523b3bb56e の情報は不要です。

UserDefaultsに保存して、下記のサイトのローカルの場合のとこに呼び出し、表示できますよ。
https://qiita.com/ninten320/items/7fbb46e350a44288b933

/////////////////////////////
以下、追記1/9

Swift

1let pdfData = NSMutableData() 2UIGraphicsBeginPDFContextToData(pdfData, self.view.bounds, nil) 3UIGraphicsBeginPDFPage() 4 5guard let pdfContext = UIGraphicsGetCurrentContext() else { return } 6self.view.layer.render(in: pdfContext) 7UIGraphicsEndPDFContext() 8 9if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { 10 let documentsFileName = documentDirectories + "/test.pdf" 11 UserDefaults.standard.set(documentsFileName, forKey:"filePath") 12 debugPrint(documentsFileName) 13 pdfData.write(toFile: documentsFileName, atomically: true) 14}

投稿2019/01/01 10:13

編集2019/01/08 16:54
hameji001

総合スコア639

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

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

mimamo

2019/01/03 14:24

ご回答ありがとうございます。 頂いた資料のリンク先からコーディングしてみました。 https://stackoverflow.com/questions/5443166/how-to-convert-uiview-to-pdf-within-ios @IBAction func preView(_ sender: UIButton) { print("プレビュー画面作成開始") let pdfData = NSMutableData() UIGraphicsBeginPDFContextToData(pdfData, getphoto.bounds, nil) UIGraphicsBeginPDFPage() guard let pdfContext = UIGraphicsGetCurrentContext() else { return } getphoto.layer.render(in: pdfContext) UIGraphicsEndPDFContext() if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { let documentsFileName = documentDirectories + "/" + "/preview.pdf" debugPrint(documentsFileName) pdfData.write(toFile: documentsFileName, atomically: true) } print("プレビュー作成おわり") } printはできるのですが、作成したpdfの扱い・確認方法がわからず戸惑っています...。
hameji001

2019/01/04 10:38 編集

おそらく、出力されて、documetDicrectoryに保存されている状態です。 これを表示するには、 ①別画面(UIViewController)を作成し表示するページを作りましょう。 ②ボタンを押して、保存後された後に、表示ページに遷移するようにperformSegueとIDをセット ③表示するページで、下記を参考に表示してみる、でできると思います。 ファイルのパス取得 https://qiita.com/morimorim/items/301cd85f83523b3bb56e PDFの表示 https://qiita.com/ninten320/items/7fbb46e350a44288b933 他にもiTunesを利用し、PCと繋いでdocumentsの中をみることができます。 その方法でもきちんと作成されたか確認できると思います。 自分の環境で実際に手を動かしてないので、保証はできませんが、 もし詰まるようだったら、また聞いてください。
mimamo

2019/01/06 05:38

お返事ありがとうございます! ③の部分で理解ができず進めない状態にあります。 質問本文の方にコーディングしたものを載せているのですが、 頂いた資料を新しく作ったUIViewControllerにただそのまま書き写すことしかできませんでした...。
hameji001

2019/01/06 11:14

上記の回答を変更させていただきます。 ご確認ください。
mimamo

2019/01/07 01:53

ありがとうございます! 実機でもpdfの確認ができるということなのですが、どこにあるのか見つけることが出来なかったので確認の仕方を教えて頂けないでしょうか。 コードを変えてみました。しかしエラーをどう正せばいいのか分かりません...。よろしくお願いします。 (質問本文のコードを変更しています。)
hameji001

2019/01/07 03:48 編集

何か勘違いしていませんか? imageviewが貼ってあるViewControllerで保存+遷移 遷移した先にpreviewのViewControllerを用意して、そこに表示するです。 なので、実機で確認と言ってもfinderみたいにリストで見えるわけではないですよ? pdfビュアーのように表示されるってことです。 概ね示したページのコードができているなら、 ①まず、作ったPDFファイルのパスを stringとしてUserdefaultsに保存するように変更。 (コンソールに出力されているもの) ②そして表示するViewControllerで、そのStringを取り出して、 pdfのURLにセットしてあげる必要があります。 mimamoさんのコードでは ②userdefaultsから取り出してますが、使ってなくないですか??? ①がきちんと保存されているのかはわかりませんが。 ②の意味をよく考えて、再トライしてください。
mimamo

2019/01/08 06:46

勘違いしていました。 やはりコーディングさせて確認する方法しかないのですね。 頂いたアドバイスを参考にいろいろやってみたのですが、どのようにURLにセットすればいいのかわからず、エラーが出て落ちてしまいます。 他に参考にしたもの https://qiita.com/takassh/items/1e32e44aa090975f2df9 質問本文のコードを変更させていただいております。 よろしくお願いいたします。
hameji001

2019/01/08 09:02 編集

// 保存 let documentsFileName = documentDirectories + "/test.pdf" UserDefaults.standard.set(documentsFileName, forKey:"filePath") // 読み込み let filePath0 = UserDefaults.standard.string(forKey:"filePath") let pdfURL = URL(fileURLWithPath: filePath0!) ちなみにiPhoneをMacに接続した状態で、 iTunesからアプリで保存したファイル一覧を見ること、 デスクトップなどに取り出す事(その後Macで開けます)はできますよ。
mimamo

2019/01/08 15:05

無事pdf表示することができました! pdfの拡張子にし、URLにパスを入れる時 ! をしていませんでした。 実機と接続することでパソコンにデータを移動することはできるのですね。調べたらやり方も出てきました。 あともうひとつお伺いしたいことがあります...。 このコードだとひとつのUIViewやUIImageしかpdf表示ができませんでした。上の写真にあるような、黄色のUIImageViewと黄色のUIImageVIewに乗っかっているピンクのUIImageVIewを一緒に(合成したように)pdf保存することはできないのでしょうか。 調べてもこれといったものを見つけることができなかったので、2つのUIImageViewを合成し、その後合成してできたUIImageViewをpdf化する方がいいのかなと今思っております。 よろしくお願いいたします。
hameji001

2019/01/08 16:52 編集

自分のコードでは両方が表示されたい状態、 iPhoneの画面に表示された状態でpdfにすることできましたよ。 保存するあたりのコードがおかしいのではないでしょうか? 最初の答えのところに自分のコードを載せておきます。 なお、「!」などのエラーはXcodeの指摘がはいりませんか? 自分もnilのオプショナルを考えるのが不得意で、 完全にXcodeの指摘頼りです。 「?か!を足してこの警告をサイレンスしますか?」 って出るので、大抵「!」を選ぶようにしてますよ。 Xcodeのいうことは聞きましょう
mimamo

2019/01/09 03:16

ありがとうございます。 コードは合っているようでした。頂いたコードを変更せずに実行すると、画面全体をpdfにすることができました! ですが全体をpdf化するのではなく、特定の範囲のみをpdf化できるようにしたいと思っています。 view▶︎canvasview→黄色のUIImageView→ピンクのUIImageViewの順にstoryboardで配置しているのですが、canvasviewに変更すると白紙になってしまいました。なので、黄色のImageViewをピンクのImageViewの親?にするか、canvasviewを2つのUIImageViewの親viewにすればいいのではと思いました。コーディングをやってみたのですが、なにか違う気がするし上手くいきませんでした...。 // ピンクImageを黄色Imageに追加. self.黄色Image.addSubview(ピンクImage) 同様にcanvasuviewにも二つのUIImageViewを追加したりしてみました。 エラーは上記のものだけで、そのとき let pdfURL = URL(fileURLWithPath: filePath0!) のfileURLWithPathがnilというものに気づけませんでした。以後同じようなエラーが出た場合はUIが上手くリンクしていなのか、もしくはどこかにnilがあるのかを考えていこうと思います。 よろしくお願いします。
hameji001

2019/01/09 03:33

試してませんが、考え方は正しそうな気がしますが、、、 canvasViewにImageViewをaddSubViewすれば、 canvasVIewを保存すれば大丈夫な気がしますよね。 また時間がある時にこっちも試してみます。 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問