#ifndef FS_OFD_SIGN_H_
#define FS_OFD_SIGN_H_

#include "common/fs_common.h"

/**
 * @brief Foxit 命名空间。
 *
 * @details Foxit PDF SDK 的所有定义和类都在此命名空间内定义。
 */
namespace foxit {
/**
 * @brief ofd 命名空间。
 */
namespace ofd {
class OFDDoc;
/**
 * @brief ofdseal 命名空间。
 */
namespace ofdseal {
class Oes;

/** 此类表示OFD签名或签章图片位置相关的信息。 */
class ImagePosition FS_FINAL : public Object {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] page_index    图像所在页的索引。
   * @param[in] x             图像所在的X坐标。
   * @param[in] y             图像所在的Y坐标。
   * @param[in] is_centered   图像是否居中。
   *                          <b>true</b>表示居中，<b>false</b>表示不居中。
   * @param[in] width         图像的宽度。
   * @param[in] height        图像的高度。
   */
  ImagePosition(int page_index, float x, float y, bool is_centered = true, float width = -1.0f, float height = -1.0f) :
    page_index(page_index),
    x(x),
    y(y),
    is_centered(is_centered),
    width(width),
    height(height) {
  }

  /**
   * @brief 构造函数，通过另一个ImagePosition对象。
   *
   * @param[in] other 另一个ImagePosition对象。
   */
  ImagePosition(const ImagePosition& other) {
    this->page_index = other.page_index;
    this->x = other.x;
    this->y = other.y;
    this->is_centered = other.is_centered;
    this->width = other.width;
    this->height = other.height;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other 另一个ImagePosition对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  ImagePosition& operator=(const ImagePosition& other) {
    this->page_index = other.page_index;
    this->x = other.x;
    this->y = other.y;
    this->is_centered = other.is_centered;
    this->width = other.width;
    this->height = other.height;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] page_index    图像所在页的索引。
   * @param[in] x             图像所在的X坐标。
   * @param[in] y             图像所在的Y坐标。
   * @param[in] is_centered   图像是否居中。
   *                          <b>true</b>表示居中，<b>false</b>表示不居中。
   * @param[in] width         图像的宽度。
   * @param[in] height        图像的高度。
   *
   * @return 无。
   */
  void Set(int page_index, float x, float y, bool is_centered = true, float width = -1.0f, float height = -1.0f) {
    this->page_index = page_index;
    this->x = x;
    this->y = y;
    this->is_centered = is_centered;
    this->width = width;
    this->height = height;
  }

  /**
   * @brief 图像所在页的索引.
   *
   */
  int page_index;

  /**
   * @brief 图像所在的X坐标.
   *
   */
  float x;

  /**
   * @brief 图像所在的Y坐标.
   *
   */
  float y;

  /**
   * @brief 图像是否居中.
   *        <b>true</b>表示居中，<b>false</b>表示不居中.
   */
  bool is_centered;

  /**
   * @brief 图像的宽度.
   *
   */
  float width;

  /**
   * @brief 图像的高度.
   *
   */
  float height;
};

FSDK_DEFINE_ARRAY(ImagePositionArray, ImagePosition)

/** 此类表示OFD骑缝章位置相关的信息。 */
class StraddlePosition FS_FINAL : public Object {
 public:
  /** 骑缝章方向枚举  。 */
  typedef enum _StraddlePositionType {
    /** @brief 骑缝章位置：左侧。 */
    e_StraddlePositionTypeLeft  =  0,
    /** @brief 骑缝章位置：上侧。 */
    e_StraddlePositionTypeTop  =  1,
    /** @brief 骑缝章位置：右侧。 */
    e_StraddlePositionTypeRight  =  2,
    /** @brief 骑缝章位置：下侧。 */
    e_StraddlePositionTypeBottom  =  3
  } StraddlePositionType;
  
  /** 骑缝章位置枚举。 */
  typedef enum _StraddleProportionType {
    /** @brief 骑缝章位置：五分之一。 */
    e_StraddleProportionOneFifth  =  1,
    /** @brief 骑缝章位置：五分之二。 */
    e_StraddleProportionTwoFifth  =  2,
    /** @brief 骑缝章位置：五分之三。 */
    e_StraddleProportionThreeFifth  =  3,
    /** @brief 骑缝章位置：五分之四。 */
    e_StraddleProportionFourFifth  =  4
  } StraddleProportionType;
  

  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] position            骑缝章位置。请参考从 @link StraddlePositionType::e_StraddlePositionTypeLeft @endlink 开始的值，
   *                                这应该是这些值中的一个。
   * @param[in] proportion          骑缝章比例。请参考从 @link StraddleProportionType::e_StraddleProportionOneFifth @endlink 开始的值，
   *                                这应该是这些值中的一个。
   * @param[in] first_page_percent  第一页面骑缝章所占比例，范围为0.0到100.0之间的值。
   * @param[in] start_page_index    起始页面索引。
   * @param[in] page_count          添加骑缝章的页面数量。
   */
  StraddlePosition(StraddlePositionType position, StraddleProportionType proportion, float first_page_percent, int start_page_index, int page_count) :
    position(position),
    proportion(proportion),
    first_page_percent(first_page_percent),
    start_page_index(start_page_index),
    page_count(page_count) {
  }

  /**
   * @brief 构造函数，通过另一个骑缝章位置对象。
   *
   * @param[in] other 另一个骑缝章位置对象。
   */
  StraddlePosition(const StraddlePosition& other) {
    this->position = other.position;
    this->proportion = other.proportion;
    this->first_page_percent = other.first_page_percent;
    this->start_page_index = other.start_page_index;
    this->page_count = other.page_count;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other 另一个骑缝章位置对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  StraddlePosition& operator=(const StraddlePosition& other) {
    this->position = other.position;
    this->proportion = other.proportion;
    this->first_page_percent = other.first_page_percent;
    this->start_page_index = other.start_page_index;
    this->page_count = other.page_count;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] position            骑缝章位置。请参考从 @link StraddlePositionType::e_StraddlePositionTypeLeft @endlink 开始的值，
   *                                这应该是这些值中的一个。
   * @param[in] proportion          骑缝章比例。请参考从 @link StraddleProportionType::e_StraddleProportionOneFifth @endlink 开始的值，
   *                                这应该是这些值中的一个。
   * @param[in] first_page_percent  第一页面骑缝章所占比例，范围为0.0到100.0之间的值。
   * @param[in] start_page_index    起始页面索引。
   * @param[in] page_count          添加骑缝章的页面数量。
   *
   * @return 无。
   */
  void Set(StraddlePositionType position, StraddleProportionType proportion, float first_page_percent, int start_page_index, int page_count) {
    this->position = position;
    this->proportion = proportion;
    this->first_page_percent = first_page_percent;
    this->start_page_index = start_page_index;
    this->page_count = page_count;
  }

  /**
   * @brief 骑缝章位置。
   *        请参考从 @link StraddlePositionType::e_StraddlePositionTypeLeft @endlink 开始的值，
   *        这应该是这些值中的一个。
   */
  StraddlePositionType position;

  /**
   * @brief 骑缝章比例。
   *        请参考从 @link StraddleProportionType::e_StraddleProportionOneFifth @endlink 开始的值，
   *        这应该是这些值中的一个。
   */
  StraddleProportionType proportion;

  /**
   * @brief 第一页面骑缝章所占比例，范围为0.0到100.0之间的值。
   *
   */
  float first_page_percent;

  /**
   * @brief 起始页面索引。
   *
   */
  int start_page_index;

  /**
   * @brief 添加骑缝章的页面数量。
   *
   */
  int page_count;
};

/** 此类表示OFD签名签章公共属性相关的信息。 */
class PublicProperties FS_FINAL : public Object {
 public:
  /**
    * @brief OFD签名/签章锁定类型定义枚举类型.
    *
    * @details 该枚举值应单独使用.
    */
  typedef enum _LockType {
    /** @brief 锁定类型：无。 */
    e_SealSignLockTypeNone   =  0,
    /** @brief 锁定类型：锁定Signatures.xml。 */
    e_SealSignLockTypeSignatureXml  =  1,
    /** @brief 锁定类型：锁定Signatures.xml和OFD.xml。 */
    e_SealSignLockTypSignatureXmlAndOFDXml  =  2
  } LockType;
  

  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] image_visible         签名或签章图片是否可见。
   *                                  <b>true</b>表示可见，<b>false</b>表示不可见。
   * @param[in] lock_type             签名或签章锁定类型。请参考从 @link LockType::e_SealSignLockTypeNone @endlink 开始的值，
   *                                  这应该是这些值中的一个。
   * @param[in] protect_annotations   是否保护注释。
   *                                  <b>true</b>表示保护，<b>false</b>表示不保护。
   * @param[in] protect_attachments   是否保护附件。
   *                                  <b>true</b>表示保护，<b>false</b>表示不保护。
   * @param[in] directory_name        签名或签章目录名称。设置此参数，主要用于签章OFD文件合并。
   */
  PublicProperties(bool image_visible = true, LockType lock_type = e_SealSignLockTypeNone, bool protect_annotations = false, bool protect_attachments = false, const String& directory_name = "") :
    image_visible(image_visible),
    lock_type(lock_type),
    protect_annotations(protect_annotations),
    protect_attachments(protect_attachments),
    directory_name(directory_name) {
  }

  /**
   * @brief 构造函数，通过另一个公共属性对象。
   *
   * @param[in] other 另一个公共属性对象。
   */
  PublicProperties(const PublicProperties& other) {
    this->image_visible = other.image_visible;
    this->lock_type = other.lock_type;
    this->protect_annotations = other.protect_annotations;
    this->protect_attachments = other.protect_attachments;
    this->directory_name = other.directory_name;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other 另一个公共属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  PublicProperties& operator = (const PublicProperties& other) {
    this->image_visible = other.image_visible;
    this->lock_type = other.lock_type;
    this->protect_annotations = other.protect_annotations;
    this->protect_attachments = other.protect_attachments;
    this->directory_name = other.directory_name;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] image_visible         签名或签章图片是否可见。
   *                                  <b>true</b>表示可见，<b>false</b>表示不可见。
   * @param[in] lock_type             签名或签章锁定类型。请参考从 @link LockType::e_SealSignLockTypeNone @endlink 开始的值，
   *                                  这应该是这些值中的一个。
   * @param[in] protect_annotations   是否保护注释。
   *                                  <b>true</b>表示保护，<b>false</b>表示不保护。
   * @param[in] protect_attachments   是否保护附件。
   *                                  <b>true</b>表示保护，<b>false</b>表示不保护。
   * @param[in] directory_name        签名或签章目录名称。设置此参数，主要用于签章OFD文件合并。
   *
   * @return 无。
   */
  void Set(bool image_visible, LockType lock_type, bool protect_annotations, bool protect_attachments, const String& dir_name) {
    this->image_visible = image_visible;
    this->lock_type = lock_type;
    this->protect_annotations = protect_annotations;
    this->protect_attachments = protect_attachments;
    this->directory_name = dir_name;
  }

  /**
   * @brief 签名或签章图片是否可见。
   *        <b>true</b>表示可见，<b>false</b>表示不可见.
   *
   */
  bool image_visible;

  /**
   * @brief 签名或签章锁定类型。
   *        请参考从 @link LockType::e_SealSignLockTypeNone @endlink 开始的值，
   *        这应该是这些值中的一个。
   */
  LockType lock_type;

  /**
   * @brief 是否保护注释。
   *        <b>true</b>表示保护，<b>false</b>表示不保护。
   *
   */
  bool protect_annotations;

  /**
   * @brief 是否保护附件。
   *        <b>true</b>表示保护，<b>false</b>表示不保护。
   *
   */
  bool protect_attachments;

  /**
   * @brief 签名或签章目录名称。设置此参数，主要用于签章OFD文件合并。
   *
   */
  String directory_name;
};

/** 此类表示和OFD签章文档相关的操作。 */
class SealDoc FS_FINAL : public Base {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] doc OFD文档对象。
   */
  explicit SealDoc(OFDDoc doc);

  /** @brief 析构函数。 */
  ~SealDoc();

  /**
   * @brief 构造函数，通过另一个签章文档对象。
   *
   * @param[in] other 另一个签章文档对象。
   */
  SealDoc(const SealDoc& other);

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other 另一个签章文档对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  SealDoc& operator = (const SealDoc& other);

  /**
   * @brief 相等操作符。
   *
   * @param[in] other 另一个签章文档对象。此函数将检查当前对象是否等于这个对象。
   *
   * @return <b>true</b> 表示相等，<b>false</b> 表示不相等。
   */
  bool operator == (const SealDoc& other) const;

  /**
   * @brief 不相等操作符。
   *
   * @param[in] other 另一个签章文档对象。此函数将检查当前对象是否不等于这个对象。
   *
   * @return <b>true</b> 表示不相等，<b>false</b> 表示相等。
   */
  bool operator != (const SealDoc& other) const;

  /**
   * @brief 检查当前对象是否为空。
   *
   * @details 当前对象为空时，表示当前对象是无用的。
   *
   * @return <b>true</b> 表示当前对象为空，<b>false</b> 表示不为空。
   */
  bool IsEmpty() const;

  /**
   * @brief 在特定页特定位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position          签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   * @param[in] dest_file         签章后保存的目标文件路径。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签章成功，<b>false</b> 表示签章失败。
   */
  bool SignWithPage(const Seal& seal, const ImagePosition& position, const String& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在特定页特定位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position          签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   * @param[in] dest_file         签章后保存的目标文件路径。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签章成功，<b>false</b> 表示签章失败。
   */
  bool SignWithPage(const Seal& seal, const ImagePosition& position, const WString& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在特定页特定位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position          签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   * @param[in] writer_callback   用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名或签章后的文件。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签章成功，<b>false</b> 表示签章失败。
   */
  bool SignWithPage(const Seal& seal, const ImagePosition& position, foxit::common::file::WriterCallback* writer_callback, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多页相同位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] page_index_array  页面索引数组，从0开始。
   * @param[in] position          签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   *                              此属性中的 @link foxit::ofd::ofdseal::ImagePosition::page_index @endlink 属性将不会生效。
   * @param[in] dest_file         签章后保存的目标文件路径。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithMultiPage(const Seal& seal, const foxit::Int32Array& page_index_array, const ImagePosition& position, const String& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多页相同位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] page_index_array  页面索引数组，从0开始。
   * @param[in] position          签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   *                              此属性中的 @link foxit::ofd::ofdseal::ImagePosition::page_index @endlink 属性将不会生效。
   * @param[in] dest_file         签章后保存的目标文件路径。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithMultiPage(const Seal& seal, const foxit::Int32Array& page_index_array, const ImagePosition& position, const WString& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多页相同位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] page_index_array  页面索引数组，从0开始。
   * @param[in] position          签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   *                              此属性中的 @link foxit::ofd::ofdseal::ImagePosition::page_index @endlink 属性将不会生效。
   * @param[in] writer_callback   用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名或签章后的文件。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithMultiPage(const Seal& seal, const foxit::Int32Array& page_index_array, const ImagePosition& position, foxit::common::file::WriterCallback* writer_callback, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多页相同位置对OFD文档进行签章。
   *
   * @param[in] seal            签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] page_scope      页面索引范围，从0开始。如下格式的字符串 "0-10,35,50-" 分别表示: 0~10页、35页、50页到最后一页。
                                "0-"，表示全部页面。
   * @param[in] position        签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
                                此属性中的 @link foxit::ofd::ofdseal::ImagePosition::page_index @endlink 属性将不会生效。
   * @param[in] dest_file       签名或签章后保存的目标文件路径。
   * @param[in] properties      签名或签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签名或签章成功，<b>false</b>表示签名或签章失败。
   */
  bool SignWithMultiPage(const Seal& seal, const String& page_scope, const ImagePosition& position, const String& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多页相同位置对OFD文档进行签名或签章。
   *
   * @param[in] seal            签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] page_scope      页面索引范围，从0开始。如下格式的字符串 "0-10,35,50-" 分别表示: 0~10页、35页、50页到最后一页。
                                "0-"，表示全部页面。
   * @param[in] position        签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
                                此属性中的 @link foxit::ofd::ofdseal::ImagePosition::page_index @endlink 属性将不会生效。
   * @param[in] dest_file       签名或签章后保存的目标文件路径。
   * @param[in] properties      签名或签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签名或签章成功，<b>false</b>表示签名或签章失败。
   */
  bool SignWithMultiPage(const Seal& seal, const String& page_scope, const ImagePosition& position, const WString& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多页相同位置对OFD文档进行签名或签章。
   *
   * @param[in] seal            签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] page_scope      页面索引范围，从0开始。如下格式的字符串 "0-10,35,50-" 分别表示: 0~10页、35页、50页到最后一页。
                                "0-"，表示全部页面。
   * @param[in] position        签名或签章图像位置参数。详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
                                此属性中的 @link foxit::ofd::ofdseal::ImagePosition::page_index @endlink 属性将不会生效。
   * @param[in] writer_callback 用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名或签章后的文件。
   * @param[in] properties      签名或签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签名或签章成功，<b>false</b>表示签名或签章失败。
   */
  bool SignWithMultiPage(const Seal& seal, const String& page_scope, const ImagePosition& position, foxit::common::file::WriterCallback* writer_callback, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在跨页位置对OFD文档进行签章，即骑缝章。
   *
   * @param[in] seal            签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position        骑缝章位置参数。详见 @link foxit::ofd::ofdseal::StraddlePosition @endlink 。
   * @param[in] dest_file       签章后保存的目标文件路径。
   * @param[in] properties      签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithStraddle(const Seal& seal, const StraddlePosition& position, const String& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在跨页位置对OFD文档进行签章，即骑缝章。
   *
   * @param[in] seal            签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position        骑缝章位置参数。详见 @link foxit::ofd::ofdseal::StraddlePosition @endlink 。
   * @param[in] dest_file       签章后保存的目标文件路径。
   * @param[in] properties      签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithStraddle(const Seal& seal, const StraddlePosition& position, const WString& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在跨页位置对OFD文档进行签章，即骑缝章。
   *
   * @param[in] seal            签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position        骑缝章位置参数。详见 @link foxit::ofd::ofdseal::StraddlePosition @endlink 。
   * @param[in] writer_callback 用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名或签章后的文件。
   * @param[in] properties      签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithStraddle(const Seal& seal, const StraddlePosition& position, foxit::common::file::WriterCallback* writer_callback, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position_array    签名或签章图像位置参数数组。详见 @link foxit::ofd::ofdseal::ImagePositionArray @endlink 。
   * @param[in] dest_file         签章后保存的目标文件路径。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithMultiPosition(const Seal& seal, const ImagePositionArray& position_array, const String& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position_array    签名或签章图像位置参数数组。详见 @link foxit::ofd::ofdseal::ImagePositionArray @endlink 。
   * @param[in] dest_file         签章后保存的目标文件路径。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithMultiPosition(const Seal& seal, const ImagePositionArray& position_array, const WString& dest_file, const PublicProperties& properties = PublicProperties());

  /**
   * @brief 在多位置对OFD文档进行签章。
   *
   * @param[in] seal              签章对象。详见 @link foxit::ofd::ofdseal::Oes @endlink 。
   * @param[in] position_array    签名或签章图像位置参数数组。详见 @link foxit::ofd::ofdseal::ImagePositionArray @endlink 。
   * @param[in] writer_callback   用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名或签章后的文件。
   * @param[in] properties        签章的公共属性参数，默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b>表示签章成功，<b>false</b>表示签章失败。
   */
  bool SignWithMultiPosition(const Seal& seal, const ImagePositionArray& position_array, foxit::common::file::WriterCallback* writer_callback, const PublicProperties& properties = PublicProperties());

  explicit SealDoc(FS_HANDLE handle);
};

/** 此类表示OFD签名相关的信息。 */
class SignatureProperties FS_FINAL : public Object {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] company         签名提供公司名称。
   * @param[in] provider_name   签名提供者名称。
   * @param[in] version         签名提供版本。
   */
  SignatureProperties(const String& company = String(), const String& provider_name = String(), const String& version = String()) :
    company(company),
    provider_name(provider_name),
    version(version) {
  }

  /**
   * @brief 构造函数，通过另一个签名属性对象。
   *
   * @param[in] other 另一个签名属性对象。
   */
  SignatureProperties(SignatureProperties& other) {
    this->company = other.company;
    this->provider_name = other.provider_name;
    this->version = other.version;
  }

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other 另一个签名属性对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  SignatureProperties& operator=(const SignatureProperties& other) {
    this->company = other.company;
    this->provider_name = other.provider_name;
    this->version = other.version;
    return *this;
  }

  /**
   * @brief 设置值。
   *
   * @param[in] company         签名提供公司名称。
   * @param[in] provider_name   签名提供者名称。
   * @param[in] version         签名提供版本。
   *
   * @return 无。
   */
  void Set(const String& company, const String& provider_name, const String& version) {
    this->company = company;
    this->provider_name = provider_name;
    this->version = version;
  }

  /**
   * @brief 签名提供公司名称。
   *
   */
  String company;

  /**
   * @brief 签名提供者名称。
   *
   */
  String provider_name;

  /**
   * @brief 签名提供版本。
   *
   */
  String version;
};

/** 此类表示和OFD签名文档相关的操作。 */
class CertificateSignDoc FS_FINAL : public Base {
 public:
  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] doc             OFD文档对象。
   * @param[in] cert_file       签名证书文件路径。
   * @param[in] cert_password   签名证书密码。
   */
  explicit CertificateSignDoc(OFDDoc doc, const String& cert_file, const String& cert_password);

  /**
   * @brief 带参数的构造函数。
   *
   * @param[in] doc             OFD文档对象。
   * @param[in] cert_file       签名证书文件路径。
   * @param[in] cert_password   签名证书密码。
   */
  explicit CertificateSignDoc(OFDDoc doc, const WString& cert_file, const String& cert_password);

  /** @brief 析构函数。 */
  ~CertificateSignDoc();

  /**
   * @brief 构造函数，通过另一个签名文档对象。
   *
   * @param[in] other 另一个签名文档对象。
   */
  CertificateSignDoc(const CertificateSignDoc& other);

  /**
   * @brief 赋值操作符。
   *
   * @param[in] other 另一个签名文档对象，其值将被赋给当前对象。
   *
   * @return 当前对象自身的引用。
   */
  CertificateSignDoc& operator = (const CertificateSignDoc& other);

  /**
   * @brief 相等操作符。
   *
   * @param[in] other 另一个签名文档对象，此函数将检查当前对象是否等于这个对象。
   *
   * @return <b>true</b> 表示相等，<b>false</b> 表示不相等。
   */
  bool operator == (const CertificateSignDoc& other) const;

  /**
   * @brief 不相等操作符。
   *
   * @param[in] other 另一个签名文档对象，此函数将检查当前对象是否不等于这个对象。
   *
   * @return <b>true</b> 表示不相等，<b>false</b> 表示相等。
   */
  bool operator != (const CertificateSignDoc& other) const;

  /**
   * @brief 检查当前对象是否为空。
   *
   * @details 当前对象为空时，表示当前对象是无用的。
   *
   * @return <b>true</b> 表示当前对象为空，<b>false</b> 表示不为空。
   */
  bool IsEmpty() const;

  /**
   * @brief 对OFD文档进行数字签名，但不添加签名图像。
   *
   * @param[in] dest_file             签名后保存的目标文件路径。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithNone(const String& dest_file, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，但不添加签名图像。
   *
   * @param[in] dest_file             签名后保存的目标文件路径。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithNone(const WString& dest_file, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，但不添加签名图像。
   *
   * @param[in] writer_callback       用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名后的文件。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithNone(foxit::common::file::WriterCallback* writer_callback, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，并添加签名图像。
   *
   * @param[in] image_file            签名图像文件路径。
   * @param[in] position              签名图像位置参数，详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   * @param[in] dest_file             签名后保存的目标文件路径。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithImage(const String& image_file, const ImagePosition& position, const String& dest_file, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，并添加签名图像。
   *
   * @param[in] image_file            签名图像文件路径。
   * @param[in] position              签名图像位置参数，详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   * @param[in] dest_file             签名后保存的目标文件路径。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithImage(const WString& image_file, const ImagePosition& position, const WString& dest_file, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，并添加签名图像。
   *
   * @param[in] image_file            签名图像文件路径。
   * @param[in] position              签名图像位置参数，详见 @link foxit::ofd::ofdseal::ImagePosition @endlink 。
   * @param[in] writer_callback       用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名后的文件。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithImage(const String& image_file, const ImagePosition& position, foxit::common::file::WriterCallback* writer_callback, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，并添加跨页签名图像，即骑缝章。
   *
   * @param[in] image_file            签名图像文件路径。
   * @param[in] image_width           签名图像宽度，单位为毫米。
   * @param[in] image_height          签名图像高度，单位为毫米
   * @param[in] position              骑缝章位置参数，详见 @link foxit::ofd::ofdseal::StraddlePosition @endlink 。
   * @param[in] dest_file             签名后保存的目标文件路径。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithStraddle(const String& image_file, float image_width, float image_height, const StraddlePosition& position, const String& dest_file, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，并添加跨页签名图像，即骑缝章。
   *
   * @param[in] image_file            签名图像文件路径。
   * @param[in] image_width           签名图像宽度，单位为毫米。
   * @param[in] image_height          签名图像高度，单位为毫米
   * @param[in] position              骑缝章位置参数，详见 @link foxit::ofd::ofdseal::StraddlePosition @endlink 。
   * @param[in] dest_file             签名后保存的目标文件路径。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithStraddle(const WString& image_file, float image_width, float image_height, const StraddlePosition& position, const WString& dest_file, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  /**
   * @brief 对OFD文档进行数字签名，并添加跨页签名图像，即骑缝章。
   *
   * @param[in] image_file            签名图像文件路径。
   * @param[in] image_width           签名图像宽度，单位为毫米。
   * @param[in] image_height          签名图像高度，单位为毫米
   * @param[in] position              骑缝章位置参数，详见 @link foxit::ofd::ofdseal::StraddlePosition @endlink 。
   * @param[in] writer_callback       用户实现的 @link common::file::WriterCallback @endlink 对象，用于保存签名后的文件。
   * @param[in] signature_properties  签名属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::SignatureProperties @endlink 。
   * @param[in] properties            签名的公共属性参数。默认值为空属性。详见 @link foxit::ofd::ofdseal::PublicProperties @endlink 。
   *
   * @return <b>true</b> 表示签名成功，<b>false</b> 表示签名失败。
   */
  bool SignWithStraddle(const String& image_file, float image_width, float image_height, const StraddlePosition& position, foxit::common::file::WriterCallback* writer_callback, const SignatureProperties& signature_properties = SignatureProperties(), const PublicProperties& properties = PublicProperties());

  explicit CertificateSignDoc(FS_HANDLE handle);
};

}  // namespace ofdseal
}  // namespace ofd
}  // namespace foxit

#endif  // _BUILD_OFDSDK_
