﻿/*
	Antenna House PDF Tool API V8.0
	C++ Interface sample program

	概要：ページ抽出 別々のPDFとして保存

	Copyright 2013-2026 Antenna House, Inc.
*/

#include < PdfTk.h >
#include < stdio.h >
#include < string >
#include < vector >
# include < sstream >

using namespace PdfTk;

int main(int argc, char* argv[])
{
	if (argc < 3) {
		printf("usage: ExtractDividePage.exe in-pdf-file out-pdf page-renge\n");
		return 1;
	}
	try
	{
		PtlParamString inputfile(argv[1]);		// 抽出元となるファイル名
		PtlParamString outputfile(argv[2]);		// 出力するファイル名

		PtlParamInput input(inputfile);
		PtlPDFDocument doc;

		// PDFファイルをロードします。
		doc.load(input);

		// 文書プロパティの取得
		PtlDocProperty& docproperty = doc.getDocProperty();

		// 文書情報の取得
		PtlDocInfo& docinfo = docproperty.getDocInfo();

		// 出力ページ範囲
		std::stringstream pageRange((std::string)argv[3]);
		std::string tmp, tmp_2;
		while (std::getline(pageRange, tmp, ',')) {

			PtlPDFDocument doc_ext;
			PtlPages& pages = doc_ext.getPages();

			// 文書プロパティの取得
			PtlDocProperty& docproperty_ext = doc_ext.getDocProperty();

			// 文書情報の取得
			PtlDocInfo& docinfo_ext = docproperty_ext.getDocInfo();

			// タイトルをコピー
			docinfo_ext.setTitle(docinfo.getTitle());

			// 著者をコピー
			docinfo_ext.setAuthor(docinfo.getAuthor());

			// サブジェクトをコピー
			docinfo_ext.setSubject(docinfo.getSubject());

			// キーワードをコピー
			docinfo_ext.setKeywords(docinfo.getKeywords());

			// クリエータをコピー
			docinfo_ext.setCreator(docinfo.getCreator());

			// プロデューサをコピー
			docinfo_ext.setProducer(docinfo.getProducer());

			// 作成日付をコピー
			docinfo_ext.setCreationDate(docinfo.getCreationDate());

			// 更新日付をコピー
			docinfo_ext.setModDate(docinfo.getModDate());

			// ページ挿入オプション
			// OPTION_NONE  = 0x00000000 オプションはありません。
			int insertoption = (PtlPages::OPTION_NONE);

			if (!tmp.empty()) {
				std::stringstream pageRange_2(tmp);
				int i = 0;
				int tmpStrt = -1;
				int tmpEnd = -1;
				while (std::getline(pageRange_2, tmp_2, '-')) {
					if (!tmp_2.empty()) {
						if (i == 0)
						{
							tmpStrt = stoi(tmp_2);
						}
						else if (i == 1)
						{
							tmpEnd = stoi(tmp_2);
						}
						else
						{
							break;
						}
						i++;
					}
				}
				std::string suffix;
				if (tmpStrt > -1) {
					if (tmpEnd == -1) {
						pages.append(doc, tmpStrt, 1, insertoption);
						suffix = std::to_string(tmpStrt);
					}
					else if (tmpEnd > -1) {
						pages.append(doc, tmpStrt, (tmpEnd - tmpStrt + 1), insertoption);
						suffix = std::to_string(tmpStrt) + "-" + std::to_string(tmpEnd);
					}

					// 出力ファイル名
					std::string outPath(outputfile.c_str());
					outPath = outPath.substr(0, outPath.find_last_of('.')) + "_" + suffix + ".pdf";
					PtlParamOutput output(outPath.c_str());

					// ファイルに保存します。
					doc_ext.save(output);
				}
			}
		}
		printf("完了!\n");
	}
	catch (const PtlException& e)
	{
		fprintf(stderr, "Error code : %d\n %s\n", e.getErrorCode(), e.getErrorMessage().c_str());
		return 1;
	}
	return 0;
}
