開発情報・ナレッジ

投稿者: SPIRERS ナレッジ向上チーム 2022年2月25日 (金)

PDF帳票 の出力データをファイルとして保存するサンプルプログラム

PDF帳票で出力されるPDFデータをファイルデータとしてSPIRALに保存したい!
という要望を聞きましたので、試しにPHPで作ってみました。
PDF帳票とは
PDF帳票ファイルの取得のAPIは、バージョン1.13.2 (2020.7.10)のリリースで可能になりました。
APIリファレンス
今回はSPIRAL の DB に登録していますが、外部のサーバにデータを送ることも可能です。
参考になればと思います。

前提

IDを元にPDF帳票のデータを取得し、PDFファイルとして、更新登録を行っています。
この機能を実装するために、PDF帳票のオプション(必須)と、APIリクエスト上限拡張(任意)が必要となります。
APIに関しては、PDFデータ取得に1回、更新登録に1回使用します。
取得ファイル数が多い場合はリクエスト上限拡張が必須となります。
PDF帳票
APIリクエスト上限

PHP

<!-- SMP_DYNAMIC_PAGE DISPLAY_ERRORS=ON NAME=PDF VERSION=7.2 -->
<?php
define("APIURL","https://pi-pe.smp.ne.jp/api/service");
define("TOKEN",""); // APIトークン
define("SECRET",""); // APIシークレットトークン
define("DB_NAME",""); // ファイルを登録するDB名

$pdfInfo = array(
	"pdf_report_title" => "", // PDF帳票に設定しているキーワード
	"key_field_title" => "id",
	"key_field_value" => "", // レコードのID
);
$pdfFileField = ""; // ファイルを登録するフィールドの差替キーワード


$common = Common::getInstance();
// PDF帳票のデータ取得
$api_headers_pdf = array(
	"X-SPIRAL-API: pdf_report/get_file/request",
	"Content-Type: application/json; charset=UTF-8",
);
$pdfData = $common->API_call($api_headers_pdf,$pdfInfo);

// PDF帳票データの登録
$api_headers_update = array(
	"X-SPIRAL-API: database/update/request",
	"Content-Type: multipart/form-data; boundary=SPIRAL_API_MULTIPART_BOUNDARY",
);
$parameters_update["db_title"] = DB_NAME;
$parameters_update["id"] = $pdfInfo["key_field_value"];
$parameters_update["data"] = array( 
	// 一緒に更新したいデータがあれば追加(ファイル生成日時など)
	// array("name" => "", "value" => ""),  
);
$pdfUpdateData = array( 
	"data" => $pdfData["data"],  
	"file_name" => $pdfData["file_name"],
	"pdfFileField" => $pdfFileField
);
$pdfUpdate = $common->API_call($api_headers_update,$parameters_update,$pdfUpdateData);


/**
 * 以下、共通
 */

class Common {

	/**
	 * シングルトンインスタンス
	 * @var UserManager
	 */
	protected static $singleton;

	public function __construct() {
		if (self::$singleton) {
			throw new Exception('must be singleton');
		}
		self::$singleton = $this;
	}

	/**
	 * シングルトンインスタンスを返す
	 * @return UserManager
	 */
	public static function getInstance() {
		if (!self::$singleton) {
			return new Common();
		} else {
			return self::$singleton;
		}
	}

	//SPIRAL API 送信ロジック
	function API_call($api_headers, $parameters ,$pdInsertData = null) {
		$parameters["passkey"] = time();
		$parameters["spiral_api_token"] = TOKEN;
		$key = $parameters["spiral_api_token"] . "&" . $parameters["passkey"];
		$parameters["signature"] = hash_hmac('sha1', $key, SECRET, false);

		if(is_array($pdInsertData)){
			$postdata = "--SPIRAL_API_MULTIPART_BOUNDARY\r\n";
			$postdata .= "Content-Type: application/json; charset=\"UTF-8\";\r\n";
			$postdata .= "Content-Disposition: form-data; name=\"json\"\r\n\r\n";
			$postdata .= json_encode($parameters);
			$postdata .= "\r\n\r\n";
			$postdata .= "--SPIRAL_API_MULTIPART_BOUNDARY\r\n";
			$postdata .= "Content-Type: application/octet-stream;\r\n";
			$postdata .= "Content-Disposition: form-data; name=\"" . $pdInsertData["pdfFileField"] . "\"; filename=\"" . $pdInsertData["file_name"] . "\"\r\n\r\n";
			$postdata .= base64_decode(str_replace(' ', '+',$pdInsertData["data"]));
			$postdata .= "\r\n\r\n";
			$postdata .= "--SPIRAL_API_MULTIPART_BOUNDARY--\r\n";
		}else{			
			// 送信用のJSONデータを作成します。
			$postdata = json_encode($parameters);
		}
		

		// curlライブラリを使って送信します。
		$curl = curl_init(APIURL);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_POST, true);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
		curl_setopt($curl, CURLOPT_HTTPHEADER, $api_headers);
		curl_exec($curl);
		// エラーがあればエラー内容を表示
		if (curl_errno($curl))
			echo curl_error($curl);
		$response = curl_multi_getcontent($curl);
		curl_close($curl);

		return json_decode($response, true);
	}

}


?>

今回のプログラムはあくまでもサンプルなので、実際に組み込む際は、エラー処理なども追加をお願いします。
不具合やほかのやり方がある等あれば、
下記の「コンテンツに関しての要望はこちら」からご連絡ください。

解決しない場合はこちら コンテンツに関しての
要望はこちら