// Copyright (C) 2003-2026, Foxit Software Inc..
// All Rights Reserved.
//
// http://www.foxitsoftware.com
//
// The following code is copyrighted and contains proprietary information and trade secrets of Foxit Software Inc..
// You cannot distribute any part of Foxit PDF SDK to any third party or general public,
// unless there is a separate license agreement with Foxit Software Inc. which explicitly grants you such rights.
//
// This file is a demo to demonstrate how to use Foxit PDF SDK to do output preview.

import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Bitmap;
import com.foxit.sdk.common.Image;
import com.foxit.sdk.common.Library;
import com.foxit.sdk.common.Renderer;
import com.foxit.sdk.common.fxcrt.Matrix2D;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.OutputPreview;

import java.io.*;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;

import static com.foxit.sdk.common.Bitmap.e_DIBInvalid;
import static com.foxit.sdk.common.Bitmap.e_DIBArgb;
import static com.foxit.sdk.common.Bitmap.e_DIBRgb32;
import static com.foxit.sdk.common.Constants.e_Rotation0;
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
import static com.foxit.sdk.pdf.PDFPage.e_ParsePageNormal;

public class output_preview {
	private static String key = "8f3g1sFttW8NAgfSNv+BvaJWy4Pp8flcm7ncNDkdvCCO4JwUFbGLyZdujReMaiplbYJwwxam3lr7uHtQaEf0xTSu8j2ZBdrZ8FS4OQkEUjOI9UEGb3Ic0GqmlP9T9OnSItOYqoZZA/OnYg5EaVP+c/ha32nUquOk+5riEdhYgINAZDdgJkPc+YSWsrfixOIROf6t34j3eRcyFnOY0MS7tSXi1AEPE0VZdyu+5bfmBSGvLI+WR5lQ+oOQR5hRGwqf990WEdBelNO7dxhZELVhEZ+/L60PpDf5y9A8qmrY6PiEU8nhqIyLpks0BxeIsYyZ3Cr82jjfbItPGyEARsIVzluBSgVMD4oGjojz8T6wGDEXUbmZH/pra94XAs8wZ28mzbmIEppWnhBqX0c6Ov8iXCfFfUZr4KNuPxMEgk4VOYTMOd70GEjGnylivw18hbn7ZpkWh2Zql+uU2HejvOgn+WHvT0HF9NhK0Xb5vH8aFkgBP92PJx8obIbxBVeeExczxvsqWufuPdXS2sPNIgMYZ2TtvqVVsiUToeGB2FQo09fzZOSH5Vi18u/siyvC3FmjeMf4+OYWPuDPNCcrb21NgcHam7XI8AAoGLTGtLLWR+fxynbBBcg2d2ZPcZ5CMFIfOBHRWCkcA0sDT3cl9nsBppHNJze/jVxHy+lREeQEA/etSIgohTGAWW3ZlpibRXqMxlmVWEPifCubbWTzQ6U54mRMpW2UghH3gvCNFNgdday3Av7EtlIJOdUuiMq3zmmd5J4Jt4C82CKnVewA0DtZ4EEtwRG9IYuLrfpuZlnjBAtoeXRV1lqUZ6BcCe0E3m9jO28sGkALuIeJQ74XG7X8lMC7lMWWQYiYD7D6G9QT6X3qV4vXJwNKRKpYc/rI+amEawTSnDYAMEaYPwtZ0rb/7BL+atsZZaI+ncebdfVfjDJZbCZAc+JnkuNlUn2xrNRuObw8h/G0lm2pNOEJ10S8R4+yplo5B1QmC2dCDhaTaW67QJPqnJPKbVmjw7i6KGBi+CDP3JnAKlOX/YUu8uk56JfeQUuGcQg/KaBMGctnchH2n1i3+oGbibhurQj22+OO66Q6mijKoCRP/QJm5WTGcO4c0iVX0B8dIlai/uv/pGU8Wps9MxysH5ViVIj56LWKuNfy1FNO9+wx4iHYnUxfW0Iccq3YJYAlOBkMv8VZIJl9aTEEFJ626LJEw/UbEBdR9CdlwnylPf4RuNW/lcGYMgq3xNVpp/bzYKwZivvQOFgMdX1tv8D33SHvAm3zrRCU+v94BJXnBi9k25fnKsc705IMwv+I6bueXA+mDnagj1oTqsWXZ0WnPAYI3WUO7sBf7XUH230wfYXnTSVhujJxiEP/2oWqi2813gtQkKwz9N2p6yT8Vsh3+BaAwwDvtOZMJKUFcabTBSL6NoouzmzwItJ4mIboT6KXaef66rs8jCU=";
	private static String sn = "Rew1vB0TqoMIxX444UcpScARWdhgJpsJfzmyMLR32a0+EgrCjp2NaQ==";
	private static String output_path = "../output_files/output_preview/";
	private static String input_path = "../input_files/";
	private static String input_file = input_path + "page_organization_123.pdf";

    // You can also use System.load("filename") instead. The filename argument must be an absolute path name.
	static {
	  String os = System.getProperty("os.name").toLowerCase();
	  String lib = "fsdk_java_";
	  if (os.startsWith("win")) {
	      lib += "win";
	  } else if (os.startsWith("mac")) {
	      lib += "mac";
	  } else {
	      lib += "linux";
	  }
	  if (System.getProperty("sun.arch.data.model").equals("64")) {
	      if(System.getProperty("os.arch").equals("aarch64")){
	          lib += "arm";
	      }
	      else{
	          lib += "64";
	      }
	  } else {
	      lib += "32";
	  }
	  System.loadLibrary(lib);
	}

	public static void main(String[] args) throws PDFException {
		createResultFolder(output_path);
		// Initialize library
		int error_code = Library.initialize(sn, key);
		if (error_code != e_ErrSuccess) {
			System.out.println("Library Initialize Error: " + error_code);
			return;
		}

		// "default_icc_folder_path" is the path of the folder which contains default icc profile files. Please refer to Developer Guide for more details.
		String default_icc_folder_path = "";
		if (default_icc_folder_path.length()<1) {
			System.out.println("default_icc_folder_path is still empty. Please set it with a valid path to the folder which contains default icc profile files.");
			return ;
		}
		// Set folder path which contains default icc profile files.
		Library.setDefaultICCProfilesPath(default_icc_folder_path);

		PDFDoc pdf_doc = new PDFDoc(input_file);
		pdf_doc.load(null);
		PDFPage pdf_page = pdf_doc.getPage(0);
		pdf_page.startParse(e_ParsePageNormal, null, false);
		float page_width = pdf_page.getWidth();
		float page_height = pdf_page.getHeight();
		int bitmap_width = (int)page_width;
		int bitmap_height = (int)page_height;
		int bitmap_format = e_DIBInvalid;
		long background_color = 0x000000;
		if (pdf_page.hasTransparency()) {
			background_color = 0x000000;
			bitmap_format = e_DIBArgb;
		} else {
			background_color = 0xFFFFFF;
			bitmap_format = e_DIBRgb32;
		}
		Matrix2D display_matrix = pdf_page.getDisplayMatrix(0, 0, bitmap_width, bitmap_height, e_Rotation0);

		Bitmap render_bitmap = new Bitmap(bitmap_width, bitmap_height, bitmap_format, null, 0);
		render_bitmap.fillRect(background_color, null);
		Renderer renderer = new Renderer(render_bitmap, false);

		OutputPreview output_preview = new OutputPreview(pdf_doc);
		String simulation_icc_file_path = input_path + "icc_profile/USWebCoatedSWOP.icc";
		output_preview.setSimulationProfile(simulation_icc_file_path);
		output_preview.setShowType(OutputPreview.e_ShowAll);
		ArrayList<String> process_plates = output_preview.getPlates(OutputPreview.e_ColorantTypeProcess);
		ArrayList<String> spot_plates = output_preview.getPlates(OutputPreview.e_ColorantTypeSpot);

		// Set check status of spot plate to be true, if there's any spot plate.
		for (int i = 0; i < (int)spot_plates.size(); i++) {
			output_preview.setCheckStatus(spot_plates.get(i), true);
		}

		// Only set one process plate to be checked each time and generate the preview bitmap.
		for (int i = 0; i < (int)process_plates.size(); i++) {
			if (0 != i)
				output_preview.setCheckStatus(process_plates.get(i - 1), false);
			output_preview.setCheckStatus(process_plates.get(i), true);

			Bitmap preview_bitmap = output_preview.generatePreviewBitmap(pdf_page, display_matrix, renderer);

			Image result_image = new Image();
			result_image.addFrame(preview_bitmap);
			String saved_file_path = output_path + "preview_result_ProcessPlate[" + i + "]_true.bmp";
			result_image.saveAs(saved_file_path);
		}
		System.out.println("[END] demo output_preview.");
		Library.release();
	}

	private static void createResultFolder(String output_path) {
		File myPath = new File(output_path);
		if (!myPath.exists()) {
			myPath.mkdir();
		}
	}
}
