Skip to content

PDF 文件集 (PDF Portfolio)

PDF 文件集 (PDF Portfolio) 是一种特殊的 PDF 文档格式,它可以将多种不同格式的文件组合在一起。Portfolio 文件本身是一个 PDF 文档,而各种类型的文件(例如 Word 文档、Excel 表格、图片、视频等)都可以作为独立的组件嵌入到这个 PDF 容器中。

系统需求

平台: Windows, Linux, Mac

开发语言: C, C++, Java, C#, Python, Objective-C, Node.js

授权许可: 需要包含 Standard模块的授权码

SDK 版本:

  • 福昕 PDF SDK (C, C++, Java, C#, Objective-C): 7.6 或更高版本
  • 福昕 PDF SDK (Python): 8.3 或更高版本
  • 福昕 PDF SDK (Node.js): 10.0 或更高版本

创建一个新的空白的 PDF Portfolio 文档

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_portfolio.h"
#include "include/pdf/fs_pdfdoc.h"

using namespace foxit;
using namespace foxit::common;
using namespace pdf;
using namespace portfolio;

// Make sure that SDK has already been initialized successfully.

Portfolio new_portfolio = Portfolio::CreatePortfolio();

// Set properties, add file/folder node to the new portfolio.
...

// Get portfolio PDF document object.
PDFDoc portfolio_pdf_doc = new_portfolio.GetPortfolioPDFDoc();
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_portfolio_c.h"

// Make sure that SDK has already been initialized successfully.

FS_PORTFOLIO_HANDLE new_portfolio = NULL;
FSDK_Portfolio_CreatePortfolio(&new_portfolio);

// Set properties, add file/folder node to the new portfolio.
...

// Get portfolio PDF document object.
FS_PORTFOLIONODE_HANDLE root_node = NULL;
FSDK_Portfolio_GetRootNode(new_portfolio, &root_node);
...

// Release handles when no need to use them any more.
if (root_node) {
	FSDK_PortfolioNode_Release(root_node);
	root_node = NULL;
}
if (new_portfolio) {
	FSDK_Portfolio_Release(new_portfolio);
	new_portfolio = NULL;
}
java
import com.foxit.sdk.common.Library;
import com.foxit.sdk.pdf.Portfolio;
import com.foxit.sdk.common.Constants;
 
// Make sure that SDK has already been initialized successfully.

Portfolio new_portfolio = Portfolio.createPortfolio();

// Set properties, add file/folder node to the new portfolio.
...

// Get portfolio PDF document object.
PDFDoc portfolio_pdf_doc = new_portfolio.getPortfolioPDFDoc();
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    # replace with the python2 lib path
    site.addsitedir(‘../../../’)
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

...
# Make sure that SDK has already been initialized successfully.

new_portfolio = Portfolio.CreatePortfolio()

# Set properties, add file/folder node to the new portfolio.
...

# Get portfolio PDF document object.
portfolio_pdf_doc = new_portfolio.GetPortfolioPDFDoc()
objc
#include "FSPDFObjC.h"

// Make sure that SDK has already been initialized successfully.
 
FSPortfolio* new_portfolio = [FSPortfolio createPortfolio];

// Set properties, add file/folder node to the new portfolio.
...

// Get portfolio PDF document object.
FSPDFDoc*portfolio_pdf_doc = [new_portfolio getPortfolioPDFDoc];
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

...
// Make sure that SDK has already been initialized successfully.

let new_portfolio = FSDK.Portfolio.CreatePortfolio();

// Set properties, add file/folder node to the new portfolio.
...

// Get portfolio PDF document object.
let portfolio_pdf_doc = new_portfolio.GetPortfolioPDFDoc();
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
 
// Make sure that SDK has already been initialized successfully.

using (Portfolio new_portfolio = Portfolio.CreatePortfolio())
{
   // Set properties, add file/folder node to the new portfolio.
   ...

   // Get portfolio PDF document object.
   using (PDFDoc portfolio_pdf_doc = new_portfolio.GetPortfolioPDFDoc())
   {
        ...
   }
}

从一个 PDF portfolio 文档创建一个 Portfolio 对象

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_portfolio.h"
#include "include/pdf/fs_pdfdoc.h"

using namespace foxit;
using namespace foxit::common;
using namespace pdf;
using namespace portfolio;

// Make sure that SDK has already been initialized successfully.

PDFDoc portfolio_pdf_doc("portfolio.pdf");
ErrorCode error_code = portfolio_pdf_doc.Load();
if (foxit::e_ErrSuccess == error_code) {
    if (portfolio_pdf_doc.IsPortfolio()) {
        Portfolio existed_portfolio = Portfolio::CreatePortfolio(portfolio_pdf_doc);
    }
}
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fs_portfolio_c.h"

// Make sure that SDK has already been initialized successfully.

FS_PDFDOC_HANDLE portfolio_pdf_doc = NULL;
FSDK_PDFDoc_Create0(portfolio_file_path, &portfolio_pdf_doc);
FSErrorCode error_code = FSDK_PDFDoc_Load(portfolio_pdf_doc, NULL);
if (e_FSErrSuccess == error_code) {
    FS_BOOL is_portfolio = FALSE;
    FSDK_PDFDoc_IsPortfolio(pdf_doc, &is_portfolio);
    if (is_portfolio) {
        FS_PORTFOLIO_HANDLE existed_portfolio = NULL;
        FSDK_Portfolio_CreatePortfolio0(pdf_doc, &existed_portfolio);
        ...
            // Release handles when no need to use them any more.
            if (existed_portfolio) {
                FSDK_Portfolio_Release(existed_portfolio);
                existed_portfolio = NULL;
            }
    }
}
...

// Release handles when no need to use them any more.
if (portfolio_pdf_doc) {
    FSDK_PDFDoc_Release(portfolio_pdf_doc);
    portfolio_pdf_doc = NULL;
}
java
import com.foxit.sdk.common.Library;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.Portfolio;
import com.foxit.sdk.common.Constants;
 
// Make sure that SDK has already been initialized successfully.
 
PDFDoc pdf_doc = new PDFDoc("portfolio.pdf");
int error_code = portfolio_pdf_doc.load(null);
if (Constants.e_ErrSuccess == error_code) {
  if (portfolio_pdf_doc.isPortfolio()) {
    Portfolio existed_portfolio = Portfolio.createPortfolio(portfolio_pdf_doc);
  }
}
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    # replace with the python2 lib path
    site.addsitedir(‘../../../’)
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

...
# Make sure that SDK has already been initialized successfully.

portfolio_pdf_doc = PDFDoc("portfolio.pdf")
error_code = portfolio_pdf_doc.Load("")
if e_ErrSuccess == error_code:
    if portfolio_pdf_doc.IsPortfolio():
        existed_portfolio = Portfolio.CreatePortfolio(portfolio_pdf_doc)
objc
#include "FSPDFObjC.h"
 
// Make sure that SDK has already been initialized successfully.

FSPDFDoc* portfolio_pdf_doc = [[FSPDFDoc alloc] initWithPath:@"portfolio.pdf"];
FSErrorCode error_code = [portfolio_pdf_docload:nil];
if (FSErrSuccess == error_code) {
  if (YES == [portfolio_pdf_doc isPortfolio]) {
    FSPortfolio* existed_portfolio = [FSPortfolio createPortfolioWithPDFDoc:portfolio_pdf_doc];
  }
}
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

...
// Make sure that SDK has already been initialized successfully.

let pdf_doc = new FSDK.PDFDoc(portfolio_file_path);
let error_code = pdf_doc.Load("");
if (error_code != FSDK.e_ErrSuccess) {
  return;
}
if (false == pdf_doc.IsPortfolio()) {
  let exist_portfolio = FSDK.Portfolio.CreatePortfolio(pdf_doc);
}
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
 
// Make sure that SDK has already been initialized successfully.

using (PDFDoc portfolio_pdf_doc = new PDFDoc("portfolio.pdf"))
{
    ErrorCode error_code = portfolio_pdf_doc.Load(null);
    if (ErrorCode.e_ErrSuccess == error_code)
    {
        if (portfolio_pdf_doc.IsPortfolio())
        {
            using (Portfolio existed_portfolio = Portfolio.CreatePortfolio(portfolio_pdf_doc))
            {
                ...
            }
        }
    }
}

获取 portfolio nodes

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_portfolio.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_filespec.h"

using namespace foxit;
using namespace foxit::common;
using namespace pdf;
using namespace portfolio;

// Make sure that SDK has already been initialized successfully.

// Portfolio object has been created, assume it is named "portfolio".
...

PortfolioNode root_node = portfolio.GetRootNode();
PortfolioFolderNode root_folder(root_node);
PortfolioNodeArray sub_nodes = root_folder.GetSortedSubNodes();
for (size_t index = 0; index < sub_nodes.GetSize(); index++) {
    PortfolioNode node = sub_nodes[index];
    switch (node.GetNodeType()) {
        case PortfolioNode::e_TypeFolder: {
            PortfolioFolderNode folder_node(node);
            // Use PortfolioFolderNode's getting method to get some properties.
            ...
            PortfolioNodeArray sub_nodes_2 = folder_node.GetSortedSubNodes();
            ...
            break;
        }
        case PortfolioNode::e_TypeFile: {
            PortfolioFileNode file_node(node);
            // Get file specification object from this file node, and then get/set information from/to this file specification object.
            FileSpec file_spec = file_node.GetFileSpec();
            ...
            break;
        }
    }
}
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_filespec_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fs_portfolio_c.h"

// Make sure that SDK has already been initialized successfully.

// Portfolio object has been created, assume it is named "portfolio".
FS_PORTFOLIONODE_HANDLE root_node = NULL;
FSDK_Portfolio_GetRootNode(portfolio, &root_node);
FS_PORTFOLIOFOLDERNODE_HANDLE root_folder = NULL;
FSDK_PortfolioFolderNode_Create(root_node, &root_folder);

FS_PORTFOLIONODE_HANDLE* sub_node_array = NULL;
FS_UINT32 array_length = 0;
FSDK_PortfolioFolderNode_GetSortedSubNodes(root_folder, sub_node_array, array_length);
sub_node_array = malloc( sizeof(FS_PORTFOLIONODE_HANDLE) * array_length];
FSDK_PortfolioFolderNode_GetSortedSubNodes(root_folder, sub_node_array, array_length);
for (FS_UINT32index = 0; index < array_length; index++) {
    FS_PORTFOLIONODE_HANDLE node = sub_node_array[index];
    FSPortfolioNodeType node_type = e_FSPortfolioNodeTypeTypeUnknown;
    FSDK_PortfolioNode_GetNodeType(node, &node_type);
    switch (node_type) {
    case e_FSTypeFolder: {
        FS_PORTFOLIOFOLDERNODE_HANDLE folder_node = NULL;
        FSDK_PortfolioFolderNode_Create(node, &folder_node);

        // Use PortfolioFolderNode's getting method to get some properties.
        ...

        FS_PORTFOLIONODE_HANDLE* sub_node_array_2 = NULL;
        FS_UINT32 array_length_2 = 0;
        FSDK_PortfolioFolderNode_GetSortedSubNodes(root_folder, sub_node_array_2, &array_length_2);
        sub_node_array_2 = malloc(siezof(FS_PORTFOLIONODE_HANDLE) * array_length_2];
        FSDK_PortfolioFolderNode_GetSortedSubNodes(root_folder, sub_node_array_2, &array_length_2);
        ...
            // Release handle
            for (FS_UINT32 i = 0; i < array_length_2; i++) {
                FSDK_PortfolioNode_Release(sub_node_array_2[i]);
            }
            free(sub_node_array_2);
            if (folder_node) {
                FSDK_PortfolioFolderNode_Release(folder_node);
                folder_node = NULL;
            }
            break;
    }
    case e_FSTypeFile: {
        FS_PORTFOLIOFILENODE_HANDLE file_node = NULL;
        FSDK_PortfolioFileNode_Create(node, &file_node);
        // Get file specification from this file node, and then get/set information from/to this file specification object.
        FS_FILESPEC_HANDLE file_spec = NULL;
        FSDK_PortfolioFileNode_GetFileSpec(file_node, &file_spec);
        ...
            // Release handle.
            if (file_spec) {
                FSDK_FileSpec_Release(file_spec);
                file_spec = NULL;
            }
            if (file_node) {
                FSDK_PortfolioFileNode_Release(file_node);
                file_node = NULL;
            }
            break;
        }
    }
}
...
// Release handles when no need to use them any more.
for (FS_UINT32 i = 0; i < array_length; i++) {
    FSDK_PortfolioNode_Release(sub_node_array[i]);
}
free(sub_node_array);
if (root_folder) {
    FSDK_PortfolioFolderNode_Release(root_folder);
    root_folder = NULL;
}
if (root_node) {
    FSDK_PortfolioNode_Release(root_node);
    root_node = NULL;
}
java
import com.foxit.sdk.common.Library;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.Portfolio;
import com.foxit.sdk.pdf.SchemaField;
import com.foxit.sdk.pdf.SchemaFieldArray;
import com.foxit.sdk.pdf.PortfolioNode;
import com.foxit.sdk.pdf.PortfolioNodeArray;
import com.foxit.sdk.pdf.PortfolioFileNode;
import com.foxit.sdk.pdf.PortfolioFolderNode;
import com.foxit.sdk.pdf.FileSpec;
import com.foxit.sdk.common.Constants;
 
// Make sure that SDK has already been initialized successfully.
 
// Portfolio object has been created, assuming it is named "portfolio".
...

PortfolioNode root_node = portfolio.getRootNode();
PortfolioFolderNode root_folder = new PortfolioFolderNode(root_node);
PortfolioNodeArray sub_nodes = root_folder.getSortedSubNodes();
for (int index = 0; index < sub_nodes.getSize(); index++) {
  PortfolioNode node = sub_nodes.getAt(index);
  switch(node.getNodeType()) {
    case PortfolioNode::e_TypeFolder: {
      PortfolioFolderNode folder_node = new PortfolioFolderNode(node);
      
      // Use PortfolioFolderNode's methods to get some properties.
      ...
      
      PortfolioNodeArray sub_nodes_2 = folder_node.getSortedSubNodes();
      ...
      break;
    }
    case PortfolioNode::e_TypeFile: {
      PortfolioFileNode file_node = new PortfolioFileNode(node);
      // Get file specification object from this file node, and then get/set information from/to this file specification object.
      FileSpec file_spec = file_node.getFileSpec();
      ...
      break;
    }
  }
}
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    # replace with the python2 lib path
    site.addsitedir(‘../../../’)
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

# Make sure that SDK has already been initialized successfully.

# Portfolio object has been created, assume it is named "portfolio".
...

root_node = portfolio.GetRootNode()
root_folder = PortfolioFolderNode (root_node)
sub_nodes = root_folder.GetSortedSubNodes()
sub_size = sub_nodes.GetSize()
for index in range(0, sub_size):
    node = sub_nodes[index]
    note_type = node.GetNodeType()
    if note_type == PortfolioNode.e_TypeFolder:
        folder_node = PortfolioFolderNode(node)
        # Use PortfolioFolderNode's getting method to get some properties.
        ...
        sub_nodes_2 = folder_node.GetSortedSubNodes()
        ...        
    elif note_type == PortfolioNode.e_TypeFile:
        file_node = PortfolioFileNode (node)
            # Get file specification object from this file node, and then get/set information from/to this file specification object.
        file_spec = file_node.GetFileSpec()
        ...
objc
#include "FSPDFObjC.h"
 
// Make sure that SDK has already been initialized successfully.
 
FSPortfolioNode* root_node = [portfolio getRootNode];
FSPortfolioFolderNode* root_folder = [[FSPortfolioFolderNode alloc] initWithOther:root_node];
FSPortfolioNodeArray* sub_nodes = [root_folder getSortedSubNodes];
for (unsigned long index = 0; index < [sub_nodes getSize]; index++) {
  FSPortfolioNode* node = [sub_nodes getAt:index];
  switch([node getNodeType]) {
    case FSPortfolioNodeTypeFolder: {
      FSPortfolioFolderNode* folder_node = [[FSPortfolioFolderNode alloc] initWithOther:node];
      // Use PortfolioFolderNode's getting method to get some properties.
      ...

      FSPortfolioNodeArray* sub_nodes_2 = [folder_node getSortedSubNodes];
      break;
    }
    case FSPortfolioNodeTypeFile: {
      FSPortfolioFileNode* file_node = [[FSPortfolioFileNode alloc] initWithOther:node];
      // Get file specification object from this file node, and then get/set information from/to this file specification object.
      FSFileSpec* file_spec = [file_node getFileSpec];
      break;
    }
  }
}
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

// Make sure that SDK has already been initialized successfully.

// Portfolio object has been created, assume it is named "portfolio".
...

let root_node = exist_portfolio.GetRootNode();
let root_folder = new FSDK.PortfolioFolderNode(root_node);
let sub_nodes = root_folder.GetSortedSubNodes();
for (let index = 0; index < sub_nodes.GetSize(); index++) {
  let node = sub_nodes.GetAt(index);
  let node_type = new FSDK.PortfolioNode(node).GetNodeType();
  switch (node_type) {
    case FSDK.PortfolioNode.e_TypeFolder:
     let folder_node = new FSDK.PortfolioFolderNode(node);
      break;
    case FSDK.PortfolioNode.e_TypeFile:
      let file_node = new FSDK.PortfolioFileNode(node);
      let file_spec = file_node.GetFileSpec();
      break;
    default:
      break;
  }
}
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
 
// Make sure that SDK has already been initialized successfully.
 
// Portfolio object has been created, assume it is named "portfolio".
...

using (PortfolioNode root_node = portfolio.GetRootNode())
{
    using (PortfolioFolderNode root_folder = new PortfolioFolderNode(root_node))
    {
        using (PortfolioNodeArray sub_nodes = root_folder.GetSortedSubNodes())
        {
            for (uintindex = 0; index < sub_nodes.GetSize(); index++)
            {
                using (PortfolioNode node = sub_nodes.GetAt(index))
                {
                    switch (node.GetNodeType())
                    {
                        case PortfolioNode::e_TypeFolder:
                            {
                                using (PortfolioFolderNode folder_node = new PortfolioFolderNode(node))
                                {
                                    // Use PortfolioFolderNode's getting method to get some properties.
                                    ...

                                    PortfolioNodeArray sub_nodes_2 = folder_node.GetSortedSubNodes();
                                    ...
                                    break;
                                }
                            }
                            case PortfolioNode::e_TypeFile:
                            {
                                using (PortfolioFileNode file_node = new PortfolioFileNode(node))
                                {
                                    // Get file specification object from this file node, and then get/set information from/to this file specification object.
                                    using (FileSpec file_spec = file_node.GetFileSpec())
                                    {
                                        ...
                                        break;
                                    }
                                }
                            }
                    }
                }
            }
        }
    }
}

添加 file node 或者 folder node

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_portfolio.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_filespec.h"

using namespace foxit;
using namespace foxit::common;
using namespace pdf;
using namespace portfolio;

// Make sure that SDK has already been initialized successfully.

// Portfolio object has been created, and the root folder node has been retrieved, assume it is named "root_folder".
...

// Add file from path.
wchar_t* path_to_a_file = L"directory/Sample.txt";
PortfolioFileNode new_file_node_1 = root_folder.AddFile(path_to_a_file);

// User can update properties of file specification for new_file_node_1 if necessary.
...

// Add file from MyStreamCallback which is inherited from StreamCallback and implemented by user.
MyStreamCallback* my_stream_callback = new MyStreamCallback();
PortfolioFileNode new_file_node_2 = root_folder.AddFile(my_stream_callback, L"file_name");

// Please get file specification of new_file_node_2 and update properties of the file specification by its setting methods.
...

// Add a loaded PDF file.
// Open and load a PDF file, assume it is named "test_pdf_doc".
...

PortfolioFileNode new_file_node_3 = root_folder.AddPDFDoc(test_pdf_doc, L"pdf_file_name");

// User can update properties of file specification for new_file_node_3 if necessary.
...

// Add a sub folder in root_folder.
PortfolioFolderNode new_sub_foldernode = root_folder.AddSubFolder(L"Sub Folder-1");

// User can add file or folder node to new_sub_foldernode.
...
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fx_stream_c.h"
#include "include/fs_portfolio_c.h"

// Make sure that SDK has already been initialized successfully.

// Add file from path.
const wchar_t* path_to_a_file = L"directory/Sample.txt";
FS_PORTFOLIOFILENODE_HANDLE new_file_node_1 = NULL;
FSDK_PortfolioFolderNode_AddFile(root_folder, path_to_a_file, &new_file_node_1);

// User can update properties of file specification for new_file_node_1 if necessary.
...

// Add file from MyStreamCallback which is inherited from FSStreamCallback and implemented by user.
FILE* filestream = NULL;
callback_filestream_word = (FSStreamCallback*)malloc(sizeof(FSStreamCallback));
_wfopen_s(&filestream, saved_word_file_path_stream, L"wb");
my_stream_callback->Flush = gFlushFileStream;
my_stream_callback->GetPosition = gGetPositionFileStream;
my_stream_callback->GetSize = gGetSizeFileStream;
my_stream_callback->IsEOF = gIsEOFFileStream;
my_stream_callback->WriteBlock = gWriteBlockFileStream;
my_stream_callback->ReadBlock = gReadBlockFileStream;
my_stream_callback->ReadBlock0 = gReadBlock0FileStream;
my_stream_callback->Release = gReleaseFileStream;
my_stream_callback->Retain = gRetainFileStream;
my_stream_callback->user_data = callback_filestream_word;
FS_PORTFOLIOFILENODE_HANDLE new_file_node_2 = NULL;
FSDK_PortfolioFolderNode_AddFile0(root_folder, my_stream_callback, L"file_name", &new_file_node_2);

// Please get file specification of new_file_node_2 and update properties of the file specification by its setting methods.
...

// Add a loaded PDF file.
// Open and load a PDF file, assume it is named "test_pdf_doc".
...
FS_PORTFOLIOFILENODE_HANDLE new_file_node_3 = NULL;
FSDK_PortfolioFolderNode_AddPDFDoc(root_folder, test_pdf_doc, L"pdf_file_name", &new_file_node_3);

// User can update properties of file specification for new_file_node_3 if necessary.
...

// Add a sub folder in root_folder.
FS_PORTFOLIOFOLDERNODE_HANDLE new_sub_foldernode = NULL;
FSDK_PortfolioFolderNode_AddSubFolder(root_folder, L"Sub Folder-1", &new_sub_foldernode);

// User can add file or folder node to new_sub_foldernode.
...

// Release handles when no need to use them any more.
if (new_sub_foldernode) {
    FSDK_PortfolioFolderNode_Release(new_sub_foldernode);
    new_sub_foldernode = NULL;
}
if (new_sub_filenode_3) {
    FSDK_PortfolioFileNode_Release(new_sub_filenode_3);
    new_sub_filenode_3 = NULL;
}
if (new_sub_filenode_2) {
    FSDK_PortfolioFileNode_Release(new_sub_filenode_2);
    new_sub_filenode_2 = NULL;
}
if (new_sub_filenode_1) {
    FSDK_PortfolioFileNode_Release(new_sub_filenode_1);
    new_sub_filenode_1 = NULL;
}
java
import com.foxit.sdk.common.Library;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.Portfolio;
import com.foxit.sdk.pdf.SchemaField;
import com.foxit.sdk.pdf.SchemaFieldArray;
import com.foxit.sdk.pdf.PortfolioNode;
import com.foxit.sdk.pdf.PortfolioNodeArray;
import com.foxit.sdk.pdf.PortfolioFileNode;
import com.foxit.sdk.pdf.PortfolioFolderNode;
import com.foxit.sdk.pdf.FileSpec;
import com.foxit.sdk.common.Constants;
 
// Make sure that SDK has already been initialized successfully.
 
// Add file from path.
String path_to_a_file = "directory/Sample.txt";
PortfolioFileNode new_file_node_1 = root_folder.addFile(path_to_a_file);

// User can update properties of file specification for new_file_node_1 if necessary.
...
  
// Add file from MyStreamCallback which is inherited from StreamCallback and implemented by user.
MyStreamCallback my_stream_callback = new MyStreamCallback();
PortfolioFileNode new_file_node_2 = root_folder.addFile(my_stream_callback, "file_name");

// Please get file specification of new_file_node_2 and update properties of the file specification by its setting methods.
...

// Add a loaded PDF file.
// Open and load a PDF file, assume it is named "test_pdf_doc".
...

PortfolioFileNode new_file_node_3 = root_folder.addPDFDoc(test_pdf_doc, "pdf_file_name");

// User can update properties of file specification for new_file_node_3 if necessary.
...
  
// Add a sub folder in root_folder.
PortfolioFolderNode new_sub_foldernode = root_folder.addSubFolder("Sub Folder-1");

// User can add file or folder node to new_sub_foldernode.
...
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    # replace with the python2 lib path
    site.addsitedir(‘../../../’)
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

...
# Make sure that SDK has already been initialized successfully.

# Portfolio object has been created, and the root folder node has been retrieved, assume it is named "root_folder".
...

# Add file from path.
path_to_a_file = "directory/Sample.txt"
new_file_node_1 = root_folder.AddFile(path_to_a_file)

# User can update properties of file specification for new_file_node_1 if necessary.
...

# Add file from MyStreamCallback which is inherited from StreamCallback and implemented by user.
my_stream_callback = MyStreamCallback()
new_file_node_2 = root_folder.AddFile(my_stream_callback, "file_name")

# Please get file specification of new_file_node_2 and update properties of the file specification by its setting methods.
...

# Add a loaded PDF file.
# Open and load a PDF file, assume it is named "test_pdf_doc".
...

new_file_node_3 = root_folder.AddPDFDoc(test_pdf_doc, "pdf_file_name")

# User can update properties of file specification for new_file_node_3 if necessary.
...

# Add a sub folder in root_folder.
new_sub_foldernode = root_folder.AddSubFolder("Sub Folder-1")

# User can add file or folder node to new_sub_foldernode.
...
objc
#include "FSPDFObjC.h"
 
// Make sure that SDK has already been initialized successfully.
 
// Add file from path.
NSString* path_to_a_file = @"directory/Sample.txt";
FSPortfolioFileNode* new_file_node_1 = [root_folder addFile:path_to_a_file];

// User can update properties of file specification for new_file_node_1 if necessary.
...
  
// Add file from MyStreamCallback which is inherited from FSFileStreamCallback and implemented by user.
MyStreamCallback* my_stream_callback = [MyStreamCallback new];
FSPortfolioFileNode* new_file_node_2 = [root_folder addFileWithStreamCallback:my_stream_callback file_name:@"file_name"];

// Please get file specification of new_file_node_2 and update properties of the file specification by its setting methods.
...
  
// Add a loaded PDF file.
// Open and load a PDF file, assume it is named "test_pdf_doc".
...

FSPortfolioFileNode* new_file_node_3 = [root_folder addPDFDoc:test_pdf_doc file_name:@"pdf_file_name"];

// User can update properties of file specification for new_file_node_3 if necessary.
...
  
// Add a sub folder in root_folder.
FSPortfolioFolderNode* new_sub_foldernode = [root_folder addSubFolder:@"Sub Folder-1"];

// User can add file or folder node to new_sub_foldernode.
...
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

...
// Make sure that SDK has already been initialized successfully.

// Portfolio object has been created, and the root folder node has been retrieved, assume it is named "root_folder".
...

// Add a non-PDF file to root folder node.
let input_file_path = input_path + "FoxitLogo.jpg";
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");
let new_sub_filenode = root_folder.AddFile(input_file_path);

// User can update properties of file specification for new_file_node_1 if necessary.
...

// Add file from MyStreamCallback which is inherited from StreamCallback and implemented by user.
let custom_streamcallback = new FileStream();
let stream_callback= new FSDK.StreamCallback(custom_streamcallback);
let new_file_node_2 = root_folder.AddFile(stream_callback, "file_name");

// Please get file specification of new_file_node_2 and update properties of the file specification by its setting methods.
...

// Add a loaded PDF file.
// Open and load a PDF file, assume it is named "test_pdf_doc".
...
let new_filenode_3 = new_sub_foldernode.AddPDFDoc(test_pdf_doc, "pdf_file_name");
// User can update properties of file specification for new_file_node_3 if necessary.
...

// Add a sub folder in root_folder.
let new_sub_foldernode = root_folder.AddSubFolder("Sub Folder-1");

// User can add file or folder node to new_sub_foldernode.
...
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;

// Make sure that SDK has already been initialized successfully.
 
// Portfolio object has been created, and the root folder node has been retrieved, assume it is named "root_folder".
...
  
// Add file from path.
string path_to_a_file = "directory/Sample.txt";
using (PortfolioFileNode new_file_node_1 = root_folder.AddFile(path_to_a_file))
{
    // User can update properties of file specification for new_file_node_1 if necessary.
    ...
}

// Add file from MyStreamCallback which is inherited from StreamCallback and implemented by user.
MyStreamCallback my_stream_callback = new MyStreamCallback();
using (PortfolioFileNode new_file_node_2 = root_folder.AddFile(my_stream_callback, "file_name"))
{
    // Please get file specification of new_file_node_2 and update properties of the file specification by its setting methods.
    ...
}

// Add a loaded PDF file.
// Open and load a PDF file, assume it is named "test_pdf_doc".
...

using (PortfolioFileNode new_file_node_3 = root_folder.AddPDFDoc(test_pdf_doc, "pdf_file_name"))
{
    // User can update properties of file specification for new_file_node_3 if necessary.
    ...
}

// Add a sub folder in root_folder.
using (PortfolioFolderNode new_sub_foldernode = root_folder.AddSubFolder("Sub Folder-1") {
    // User can add file or folder node to new_sub_foldernode.
    ...
}

移除 node

c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_portfolio.h"
#include "include/pdf/fs_pdfdoc.h"

using namespace foxit;
using namespace foxit::common;
using namespace pdf;
using namespace portfolio;

// Make sure that SDK has already been initialized successfully.

// Remove a child folder node from its parent folder node.
parent_folder_node.RemoveSubNode(child_folder_node);
// Remove a child file node from its parent folder node.
parent_folder_node.RemoveSubNode(child_file_node);
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_portfolio_c.h"

// Make sure that SDK has already been initialized successfully.

// Remove a child folder node from its parent folder node.
FSDK_PortfolioFolderNode_RemoveSubNode(parent_folder_node, child_folder_node);
// Remove a child file node from its parent folder node.
FSDK_PortfolioFolderNode_RemoveSubNode(parent_folder_node, child_file_node);
java
import com.foxit.sdk.common.Library;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.Portfolio;
import com.foxit.sdk.pdf.SchemaField;
import com.foxit.sdk.pdf.SchemaFieldArray;
import com.foxit.sdk.pdf.PortfolioNode;
import com.foxit.sdk.pdf.PortfolioNodeArray;
import com.foxit.sdk.pdf.PortfolioFileNode;
import com.foxit.sdk.pdf.PortfolioFolderNode;
import com.foxit.sdk.pdf.FileSpec;
import com.foxit.sdk.common.Constants;
 
// Make sure that SDK has already been initialized successfully.
 
// Remove a child folder node from its parent folder node.
parent_folder_node.removeSubNode(child_folder_node);
// Remove a child file node from its parent folder node.
parent_folder_node.removeSubNode(child_file_node);
py
import sys
import site

if sys.version_info.major == 2:
    _PYTHON2_ = True
else:
    _PYTHON2_ = False

if _PYTHON2_:
    # replace with the python2 lib path
    site.addsitedir(‘../../../’)
    from FoxitPDFSDKPython2 import *
else:
    from FoxitPDFSDKPython3 import *

...

# Make sure that SDK has already been initialized successfully.

# Remove a child folder node from its parent folder node.
parent_folder_node.RemoveSubNode(child_folder_node)
# Remove a child file node from its parent folder node.
parent_folder_node.RemoveSubNode(child_file_node)
objc
#include "FSPDFObjC.h"
 
// Make sure that SDK has already been initialized successfully.
 
// Remove a child folder node from its parent folder node.
[parent_folder_node removeSubNode:child_folder_node];
// Remove a child file node from its parent folder node.
[parent_folder_node removeSubNode:child_file_node];
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");

...

// Make sure that SDK has already been initialized successfully.

// Remove a child folder node from its parent folder node.
parent_folder_node.RemoveSubNode(child_folder_node);
// Remove a child file node from its parent folder node.
parent_folder_node.RemoveSubNode(child_file_node);
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
 
// Make sure that SDK has already been initialized successfully.
 
// Remove a child folder node from its parent folder node.
parent_folder_node.RemoveSubNode(child_folder_node);
// Remove a child file node from its parent folder node.
parent_folder_node.RemoveSubNode(child_file_node);