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

	概要：画像抽出

	Copyright 2018 Antenna House, Inc.
*/

#include < PdfTk.h >
#include < stdio.h >

using namespace PdfTk;

void extractImage(PtlPage& page, const char* imagefilename, char kind);

int main(int argc, char* argv[])
{
	if (argc < 4) {
		printf("usage: ExtractImage.exe in-pdf-file out-image-file 出力フォーマット\n\n");
		printf("出力フォーマット\n0 : 自動  1 : BMP  2 : JPEG  3 : PNG\n");
		return 1;
	}

	const char* kind = argv[3];
	switch (kind[0]) {
	case '0':
	case '1':
	case '2':
	case '3':
		break;
	default:
		return 1;
	}

	try
	{
		PtlParamInput input(argv[1]);

		PtlPDFDocument doc;

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

		// ページコンテナの取得
		PtlPages& pages = doc.getPages();

		if (pages.isEmpty()){
			printf("ページコンテナが空\n");
			return 1;
		}

		// 先頭ページの取得
		PtlPage page = pages.get(0);

		// 画像抽出
		extractImage(page, argv[2], kind[0]);

		printf("完了!\n");
	}
	catch (const PtlException &e)
	{
		fprintf(stderr, "Error code : %d\n %s\n", e.getErrorCode(), e.getErrorMessage().c_str());
		return 1;
	}
	return 0;
}

void extractImage(PtlPage& page, const char* imagefilename, char kind)
{
	int numImage = 0;
	// ページコンテントの取得
	PtlContent& content = page.getContent();
	// 画像エレメントの取得
	PtlEditElements& elems = content.getEditElements(PtlContent::GET_IMAGE);
	int numElems = elems.getCount();
	if (numElems == 0) return;

	PtlEditImage::OUTPUT_FORMAT format = PtlEditImage::FORMAT_AUTO;
	switch (kind) {
	case '1':
		format = PtlEditImage::FORMAT_BMP; 
		break;
	case '2':
		format = PtlEditImage::FORMAT_JPEG;
		break;
	case '3':
		format = PtlEditImage::FORMAT_PNG;
		break;
	}
	for (int i=0; i < numElems; ++i) {
		// 画像エレメントの取得
		PtlEditElement& elem = elems.get(i);
		PtlEditElement::ELEMENT_TYPE type = elem.getType();
		switch (type) {
		case PtlEditElement::TYPE_IMAGE:
			{
				++numImage;
				PtlEditImage& elemImage = (PtlEditImage&)elem;
				char pathImage[256] = {'\0'};
				switch (format) {
				case PtlEditImage::FORMAT_AUTO:
					sprintf_s(pathImage, "%s%d", imagefilename, numImage);
					break;
				case PtlEditImage::FORMAT_BMP:
					sprintf_s(pathImage, "%s%d.bmp", imagefilename, numImage);
					break;
				case PtlEditImage::FORMAT_JPEG:
					sprintf_s(pathImage, "%s%d.jpg", imagefilename, numImage);
					break;
				case PtlEditImage::FORMAT_PNG:
					sprintf_s(pathImage, "%s%d.png", imagefilename, numImage);
					break;
				}
				PtlParamOutput output(pathImage);
				elemImage.writeFile(output, format);
			}
			break;
		default:
			break;
		}
	}
}
