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

	概要：ページ抽出２

	Copyright 2013-2025 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: ExtractPage_2.exe in-pdf-file out-pdf page-renge\n");
		return 1;
	}
	try
	{
		PtlParamString inputfile(argv[1]);		// 抽出元となるファイル名
		PtlParamString outputfile(argv[2]);		// 出力するファイル名

		PtlParamInput input(inputfile);
		PtlParamOutput output(outputfile);
		PtlPDFDocument doc;

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

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

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

		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 );

		// 出力ページ範囲
		//std::vector<std::string> Ranges;
		std::stringstream pageRange((std::string)argv[3]);
		std::string tmp, tmp_2;
		while (std::getline(pageRange, tmp, ',')) {
			if (!tmp.empty()) {
				std::stringstream pageRange_2(tmp);
				int i = 0, tmpStrt = -1, 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++;
					}
				}
				if (tmpStrt > -1) {
					if (tmpEnd == -1) {
						pages.append(doc, tmpStrt, 1, insertoption);
					}
					else if (tmpEnd > -1) {
						pages.append(doc, tmpStrt, (tmpEnd - tmpStrt + 1), insertoption);
					}
				}
			}
		}
		// ファイルに保存します。
		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;
}
