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

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

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

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

769閲覧

pdfmakeで生成したPDFを添付ファイルとして、FuelPHPからメール送信したい

gzrita

総合スコア236

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2017/08/07 07:19

実現したい内容

アプリ内での入力を反映したPDFを生成し、FAXで送信するサービスを計画しています。
PDFの生成まではクライアント側で行いたいので「pdfmake」を使用し、
FAX送信にはPDFを添付したメールを送るとFAX送信する、外部のサービスを利用することにしました。

参考<pdfmake> : http://pdfmake.org/

考えている流れとしては以下の通りです。

  1. アプリ内でPDFを生成。pdfmakeの機能を使いBASE64形式で書き出す。
  2. 書き出したデータを、ajaxを用いてFuelPHPで作られたシステムへ送信。
  3. 受け取ったデータを添付ファイルとして、FAX送信サービスの専用メールアドレスへ送信。
  4. 結果をアプリ内で通知。

発生している問題

受信したメールの** PDFが破損 **しており、開くことができなくなってしまいます。
結果、FAXの送信を行うことができない状態です。

実装しているコード

動作の確認のため、以下の2点のみに絞って検証しています。

  1. PDFファイルの作成
  2. データを添付してのメール送信

しかしこの地点で、うまく動作しない状況です。
コードは以下の通りです。

1.PDFファイルの作成

pdfmakeには別途カスタムフォント(源真ゴシック)を読み込ませています。→ 参考
.open();によるPDFの生成までは問題なく実装できている状態です。

javascript

1pdfMake.fonts = { 2 GenShin:{ 3 normal: 'GenShinGothic-Normal-Sub.ttf', 4 bold: 'GenShinGothic-Normal-Sub.ttf', 5 italics: 'GenShinGothic-Normal-Sub.ttf', 6 bolditalics: 'GenShinGothic-Normal-Sub.ttf' 7 } 8} 9var docDefinition = { 10 content:['テスト'], 11 defaultStyle:{ 12 font: 'GenShin' 13 } 14}; 15pdfMake.createPdf(docDefinition).open(); //内容の確認用。問題なくPDFが生成できるのは確認できています。 16pdfMake.createPdf(docDefinition).getBase64(function(data){ 17 console.log(data); //後述 18});

console.log(data);の部分では以下のような出力が得られました。
コンソールを見る限り、改行などは無さそうです。

JVBERi0xLjMKJf////8KNiAwIG9iago8PAovVHlwZSAvRXh0R1N0YXRlCi9jYSAxCj4+CmVuZG9iago1IDAgb2JqCjw8Ci9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL01lZGlhQm94IFswIDAgNTk1LjI4IDg0MS44OV0KL0NvbnRlbnRzIDMgMCBSCi9SZXNvdXJjZXMgNCAwIFIKPj4KZW5kb2JqCjQgMCBvYmoKPDwKL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUldCi9FeHRHU3RhdGUgPDwKL0dzMSA2IDAgUgo+PgovRm9udCA8PAovRjEgNyAwIFIKPj4KPj4KZW5kb2JqCjggMCBvYmoKPDwKL1Byb2R1Y2VyIChwZGZtYWtlKQovQ3JlYXRvciAocGRmbWFrZSkKL0NyZWF0aW9uRGF0ZSAoRDoyMDE3MDgwNzA1NDYwMlopCj4+CmVuZG9iagoxMCAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9VWFFTUU4rV2ViU3Vic2V0Rm9udAovRmxhZ3MgNAovRm9udEJCb3ggWy00MS45OTIxODcgLTI3OS4yOTY4NzUgMTAwMCA5NzcuNTM5MDYzXQovSXRhbGljQW5nbGUgMAovQXNjZW50IDEwNzUuMTk1MzEzCi9EZXNjZW50IC0zMjAuMzEyNQovQ2FwSGVpZ2h0IDEwNzUuMTk1MzEzCi9YSGVpZ2h0IDAKL1N0ZW1WIDAKL0ZvbnRGaWxlMiA5IDAgUgo+PgplbmRvYmoKMTEgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL0NJREZvbnRUeXBlMgovQmFzZUZvbnQgL1VYUVNRTitXZWJTdWJzZXRGb250Ci9DSURTeXN0ZW1JbmZvIDw8Ci9SZWdpc3RyeSAoQWRvYmUpCi9PcmRlcmluZyAoSWRlbnRpdHkpCi9TdXBwbGVtZW50IDAKPj4KL0ZvbnREZXNjcmlwdG9yIDEwIDAgUgovVyBbMCBbMTAyNCAxMDAwIDEwMDAgMTAwMF1dCj4+CmVuZG9iago3IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMAovQmFzZUZvbnQgL1VYUVNR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

2.データを添付してのメール送信

先程出力されたデータを添付ファイルとしてメール送信を試みています。

PHP

1public function action_index(){ 2 3 $pdf_data = 'JVBERi0xLjMKJf////8KNiAwIG9i...'; //先程出力されたデータをそのまま貼り付けています。 4 5 Package::load('email'); 6 7 $email = Email::forge('jis'); 8 $email->from('sample@sample.domain','送信者名'); 9 $email->to('sample@sample.domain'); 10 $email->subject('PDF送信テスト'); 11 $email->body(''); 12 $email->string_attach($pdf_data,'test.pdf'); //ファイル添付部分 13 14 try{ 15 $email->send(); 16 } 17 catch(\EmailValidationFailedException $e){/* 中略 */} 18 catch(\EmailSendingFailedException $e){/* 中略 */} 19 return false; 20}

受信するメーラーによって異なることもあるかと思い、
OutlockやGmail等の社内で確認可能な範囲では検証してみたのですが、
いずれもファイルが破損してしまいました。

質問したい内容

  • PDFファイルを送信したい場合、上記の方法は異なっているのでしょうか。
  • あるいは、別に設定すべき点を見逃しているのでしょうか。
  • もし他にこの様な実装を行えるアイデアがあれば、ご指導頂けますと幸いです。

pdfmakeについて調べていたところ、BASE64以外にも様々な出力方法(参考)があるようなので、
ひょっとするともっと良いアプローチがあるのかもしれません。

私の力不足でお手数をおかけいたしますが、
どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

jsでbase64にエンコードしてますから、バイナリに戻す必要があるかと思いますよ。
PHP: base64_decode - Manual

投稿2017/08/08 05:40

Lhankor_Mhy

総合スコア36074

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

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

gzrita

2017/08/08 09:12

ご回答ありがとうございます。 そりゃあ、そうですね。大変失礼いたしました。 どこで読み間違えたのか、FuelPHPのstring_attachメソッドには BASE64化したものを使用すると思い込んでいました。 お恥ずかしい限りです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問