// 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 contains an example to demonstrate how to use Foxit PDF SDK to extract attached files from PDF files and
// add files as attachments to PDF files.

import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.DateTime;
import com.foxit.sdk.common.Library;
import com.foxit.sdk.pdf.Attachments;
import com.foxit.sdk.pdf.FileSpec;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.objects.PDFNameTree;

import java.io.File;
import java.io.FileWriter;

import static com.foxit.sdk.common.Constants.e_ErrSuccess;
import static com.foxit.sdk.pdf.PDFDoc.e_SaveFlagNoOriginal;

public class attachment {
    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/attachment/";
    private static String input_path = "../input_files/";

    // 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")){
            if(os.startsWith("mac")){
              lib += "arm";
             }
             else{
               lib += "armv8";
             }
           }
           else{
              lib += "64";
           }
        } else {
           if(System.getProperty("os.arch").equals("arm")){
              lib += "armv7";
           }
           else{
              lib += "32";
           }
        }
        System.loadLibrary(lib);
    }

    static String DateTimeToString(DateTime datetime) {

        return String.format("%d/%d/%d-%d:%d:%d %s%d:%d", datetime.getYear(), datetime.getMonth(), datetime.getDay(), datetime.getHour(),
                datetime.getMinute(), datetime.getSecond(), datetime.getUtc_hour_offset() > 0 ? "+" : "-", datetime.getUtc_hour_offset(),
                datetime.getUtc_minute_offset());
    }

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

    public static void main(String[] args) throws PDFException {

        createResultFolder(output_path);
        String input_file = input_path + "attachment.pdf";
        // Initialize library.
        int error_code = Library.initialize(sn, key);
        if (error_code != e_ErrSuccess) {
            System.out.println(String.format("Library Initialize Error: %d", error_code));
            return;
        }

        String file_info = output_path + "attachMent_info.txt";
        try {
            PDFDoc doc = new PDFDoc(input_file);
            error_code = doc.load(null);
            if (error_code != e_ErrSuccess) {
                System.out.println(String.format("The Doc [%s] Error: %d", input_file, error_code));
                return;
            }

            PDFNameTree empty_nametree = new PDFNameTree();
            {
                FileWriter text_doc = new FileWriter(file_info, false);
                // Get information of attachments.
                Attachments attachments = new Attachments(doc, empty_nametree);
                int count = attachments.getCount();
                for (int i = 0; i < count; i++) {
                    String key = attachments.getKey(i);
                    text_doc.write(String.format("key:\t\t%s\r\n", key));

                    FileSpec file_spec = attachments.getEmbeddedFile(key);
                    if (!file_spec.isEmpty()) {
                        String name = file_spec.getFileName();
                        text_doc.write(String.format("Name:\t\t%s\r\n", name));
                        text_doc.write(String.format("Size:\t\t%d\r\n", file_spec.getFileSize()));
                        text_doc.write(String.format("Is embedded:\t%s\r\n", file_spec.isEmbedded() ? "true" : "false"));
                        text_doc.write(String.format("Creation time:\t%s\r\n", DateTimeToString(file_spec.getCreationDateTime())));
                        text_doc.write(String.format("Modified time:\t%s\r\n", DateTimeToString(file_spec.getModifiedDateTime())));
                        text_doc.write("\r\n");

                        if (file_spec.isEmbedded()) {
                            String export_file_path = output_path + name;
                            boolean is_success = file_spec.exportToFile(export_file_path);
                            if (is_success)
                                System.out.println(String.format("File %s. Exported to File: success", name));
                            else
                                System.out.println(String.format("File %s. Exported to File: failed", name));
                        }
                    }
                }
                text_doc.close();
            }
            
            {
                // Remove all attachments
                Attachments attachment = new Attachments(doc, empty_nametree);
                attachment.removeAllEmbeddedFiles();
                String newPdf = output_path + "attachment_remove.pdf";
                doc.saveAs(newPdf, e_SaveFlagNoOriginal);
                System.out.println("Remove all attachments.");

            }
            
            {
                String text_path = input_path + "AboutFoxit.pdf";
                Attachments attachment = new Attachments(doc, empty_nametree);
                // Add new attachment to PDF document.
                attachment.addFromFilePath("OriginalAttachmentsInfo", text_path);
                String newPdf = output_path + "attachment_add.pdf";
                doc.saveAs(newPdf, e_SaveFlagNoOriginal);
                System.out.println("Add a new attachment to PDF document.");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        Library.release();
    }
}

