前言 文档处理一般经过三个环节:流、版、签;流式软件负责编辑,如:office、wps等。版式软件负责文档定型,保证显示样式不跑偏;版式文件格式有两种:pdf、ofd。签章软件负责对版式文档签章。签章是文档处理的最后一个环节。
  当前,市面上的版式文件还是以pdf为主;对pdf的签章,国内研究的比较多。但是对ofd签章,国内研究时间不长,相关成熟的产品并不多。作者研究ofd多年,仔细分析了ofd签章标准,编写了一套签章软件,可以满足自由签章、骑缝章等类型的签章。作者采用的签章方法有以下优点:思路新颖、处理速度快、能满足各类复杂签章需求。

1 OFD签章基本概念

  签章的目的是保证数据的完整性、真实性。完整性是通过记录ofd文件的哈希值来保证的(国产算法为SM3);真实性是通过非对称加密算法保证的(国产算法为SM2)。签章的过程其实就是记录ofd内的各个文件哈希值,再用私钥对哈希值签名。

2 OFD签章遵循的标准

  OFD签章涉及的标准不止一个;这往往导致开发签章软件时茫然无措。

  ofd签章遵循两类标准:

  2.1  ofd板式文件格式标准:《 GB/T 33190-2016电子文件存储与交换格式》
  2.2  签章密码技术规范: 《GM/T 0031-2014 安全电子签章密码技术规范》,《GB/T 38540-2020信息安全技术 安全电子签章密码技术规范》。

3 签章后,哪些文件被改动?

  签章过程后,以下文件被修改。

3.1 OFD.xml

3.2 Signatures.xml

  签章汇总文件

3 Signature.xml

  具体签章文件,记录印章数据、签章数据、各个文件哈希值、印章位置信息等。

4 签章需要主要事项

  通过以上分析,可以看出签章好像并不难。其实不然,有几个问题要注意:

  4.1   不要想当然的认为OFD文件的路径都是固定的。OFD文件只有入口文件“OFD.xml”,名字是固定;其它任何文件名字都是可变的。只是为了方便理解,生成的ofd文件名称遵循一定的规则。
  下图只是建议的组织和命名规则。

  4.2  如果是多印章,后签的印章不能影响前一个印章。

    如果文档已经做了签章了,再签章时,除了签章汇总文件(Signatures.xml)外,其他文件不能做任何改动。

  4.3  骑缝章处理。对于骑缝章,需要计算每个章的位置。需要分析出文件的页数以及每页尺寸信息。

5 签章处理步骤

5.1 分析ofd原文件,将文件分类。

  通过入口文件“OFD.xml”,层层剖析,将ofd内各类文件分类,具体分类如下:

enum class EN_OfdFileType
{unset,root,doucument,publicRes,documentRes,pageContent,resFile,annotations,annotation_page,customTags,customTagContent,templatePage,signatures,signatureContent,signedValue,signedSeal,attachments,attachmentContent
};

在分析过程中,同时解析出ofd页文件的尺寸。得出每个文件的属性。

class OfdFileInfoDetail
{
public:EN_OfdFileType OfdFileType = EN_OfdFileType::unset;QString FilePath;           //文件的完整路径QByteArray FileContent;     //文件内容int OfdFileIndex = -1;      //文件索引 多文档的情况下 有用//为ofd页面时,有效;OfdFileType=pageContentint PageIndex = -1; //页索引int PageId = -1;    //页idQString PhysicalBox; //页尺寸//为ofd Signature时,有效;OfdFileType=signatureContentint SignatureIndex = -1;//在文件Signatures中的索引QString PathSeal;       //印章文件路径QString PathSignedValue;//签名后文件路径
};

5.2 对分析后的文件处理

  如果是第一次签章,需要生成Signatures.xml。

 QSharedPointer<OfdFileInfoDetail> signaturesFile = GetOfdFile(EN_OfdFileType::signatures);if(signaturesFile.isNull()){QString signaturesPath = AddSignaturesPathToRoot(rootFile);OfdFileInfoDetail *signaturesFileInfo = CreateSignaturesFile(signaturesPath);signaturesFile.reset(signaturesFileInfo);_listOfdFile.append(signaturesFile);}

  计算文件的哈希值,计算印章的位置,生成Signature.xml。

void SignOfdFile::CreateSignature(QString signaturePath,QByteArray& signatureFileContent,QString& signedValuePath)
{QSharedPointer<XmlNode> header(new XmlNode());header->SetName("Signature");header->SetNameSpace(OfdCreatorParam::OFD_NameSpace);header->SetNameSpaceUrl(OfdCreatorParam::OFD_NameSpaceUrl);XmlNode *nodeSignedInfo = header->AddChildByName("SignedInfo",true);//nodeProviderXmlNode *nodeProvider = nodeSignedInfo->AddChildByName("Provider",true);nodeProvider->SetAttr("Company",_company);nodeProvider->SetAttr("Version",_version);nodeProvider->SetAttr("ProviderName",_providerName);//SignatureMethodXmlNode *nodeSignatureMethod = nodeSignedInfo->AddChildByName("SignatureMethod",true);nodeSignatureMethod->SetText(_signInfoInput.signMethod);//SignatureDateTimeXmlNode *nodeSignatureDateTime = nodeSignedInfo->AddChildByName("SignatureDateTime",true);nodeSignatureDateTime->SetText(_signInfoInput.signDateTime);//Sealif(!_sealData.isEmpty()){XmlNode *nodeSeal = nodeSignedInfo->AddChildByName("Seal",true);XmlNode *nodeSealBaseLoc= nodeSeal->AddChildByName("BaseLoc",true);QString sealPath = OfdPathHelper::GetOfdFullPath(signaturePath,"Seal.esl");nodeSealBaseLoc->SetText(OfdPathHelper::AddStartSlash(sealPath));AddSealToFile(sealPath);}//ReferencesXmlNode *nodeReferences = nodeSignedInfo->AddChildByName("References",true);nodeReferences->SetAttr("CheckMethod",SignOfdParam::MethodName_SM3);foreach(QSharedPointer<OfdFileInfoDetail> file , _listOfdFile){if(file->OfdFileType == EN_OfdFileType::signatures)continue;if(file->FileContent.isEmpty())continue;XmlNode *nodeReference = nodeReferences->AddChildByName("Reference",true);nodeReference->SetAttr("FileRef",OfdPathHelper::AddStartSlash(file->FilePath));XmlNode *nodeCheckValue = nodeReference->AddChildByName("CheckValue",true);nodeCheckValue->SetText(sm3_digest_base64(file->FileContent));}//StampAnnotCreateStampAnnot(nodeSignedInfo);//SignedValue.datsignedValuePath = OfdPathHelper::GetOfdFullPath(signaturePath,"SignedValue.dat");XmlNode *nodeSignedValue = header->AddChildByName("SignedValue",true);nodeSignedValue->SetText(OfdPathHelper::AddStartSlash(signedValuePath));//添加到文件列表QSharedPointer<OfdFileInfoDetail> signatureFile(new OfdFileInfoDetail());signatureFile->FilePath = signaturePath;signatureFile->FileContent = header->CreateXml(true).toUtf8();signatureFile->OfdFileType = EN_OfdFileType::signatureContent;_listOfdFile.append(signatureFile);signatureFileContent = signatureFile->FileContent;
}

后记 本文粗略的描述了ofd签章的过程,实现签章的途径有多种。本文给出了一种可行、易懂的签章方法。具体的签章过程涉及大量细节处理,对于开发人员来讲是一种挑战。作者通过多次修改完善,编写了一款签章服务软件,可以与签名接口对接,就大大减轻了签章的难度。

ofd文件电子签章实现方法相关推荐

  1. 在嵌入在html中的pdf电子签章,一种网页PDF中电子签章定位方法与流程

    本发明属于一种电子签章技术领域,具体涉及一种网页PDF中电子签章定位方法. 背景技术: 国密电子签章中的套章方法操作复杂,无法对电子文档中一次性加盖多个印章的,大大降低了盖章效率,尤其是无法在所有需要 ...

  2. ofd转成html,基于HTML5的OFD文件在线显示的方法以及装置与流程

    技术特征: 1.一种基于HTML5的OFD文件在线显示的方法,其特征在于:包括如下步骤: 步骤1.服务器端将OFD文件压缩包进行解压,并将解压后得到的OFD文档目录结构映射至HTML5客户端的URL: ...

  3. PDF电子签章,用鼠标拖动印章到指定的位置, 一种在网页PDF中电子签章定位方法

    目录 一.需求 二.最后的效果 三.解决思路 一.需求 在开发PDF电子签章(电子签名),后台用itextpdf进行签名,前台用pdf.js显示pdf文件,在前台用鼠标拖动印章到指定的位置,点击PDF ...

  4. java给pdf文件电子签章

    电子签章简介: 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身份,保证文件的完整性,并表示签署者同 ...

  5. 怎么打开ofd文件的三种方法

    我们在运行电脑的过程中,可能会看到ofd格式的文件,这是什么文件格式?要怎么打开ofd文件呢?下面小编就给大家整理了三种打开方法,快来试试吧. win11系统下载_win11最新版_win11正式版系 ...

  6. 平台电子签章实现方法

    有的单位,需要在文件上盖章,从而彰显正式,以及法律效益!几经研究终于找到实现的办法,下面我们详细的讲下. 主要步骤: 1.公章制作:在OA个人信息-我的签名,哪里设置公章.先把公章制作成图片,然后新增 ...

  7. PDF文件电子签章支持库比较

    概述 印章是我国特有的历史文化产物,古代主要用作身份凭证和行驶职权的工具.它的起源是由于社会生活的实际需要.早在商周时代,印章就已经产生.如今的印章已成为一种独特的,融实用性和艺术性为一体的艺术瑰宝. ...

  8. OFD怎么转换成PDF? OFD文件转换成Word方法推荐

    随着当前办公系统的不断优化,也衍生出很多特殊的文件格式.像之前我们聊过的caj文件,是针对论文打造的特殊文件格式,即对文件有了强大的安全系数保护,又可以满足用户的阅读需求.这一次我们要为广大用户们带来 ...

  9. ofd文件怎么打开?分享三个ofd文件打开方法

    最近有一种新的文档格式闯入我们的视线,那就是--odf.可能首次接触或者跟我一样不太了解这个格式的小伙伴们,很多都不知道ofd文件怎么打开吧. 先带大家认识一下什么是ofd,ofd于我们常用的另一种格 ...

  10. word文件上的电子签章的法律效力如何保证?

    你有没有见过这样的word文件"电子签章"? 这种用PS制作的"电子签章",或者在一些输入公司名称就能在线生成"电子签章"的小网站.小作坊买 ...

最新文章

  1. Python的字符串操作和Unicode
  2. Python编程中一些异常处理的小技巧
  3. 计算机绘图模型的参数方程,关于曲线绘图与运动控制问题的研究.doc
  4. JavaScript的中对象创建和继承原理
  5. 使用原生js将轮播图组件化
  6. vb FindwindowEx的用法实例
  7. Makefile.am、Makefile.in、Makefile、configure.ac关系(十二)
  8. 从ELK到EFK演进
  9. 10.Doctrine2 (2)
  10. 多学习,C++值得看的书籍
  11. 李航老师《统计学习方法》及相关资源(代码、课件)的汇总及下载
  12. 奥西750服务器系统,奥西TDS750驱动
  13. 《Information Management:A Proposal》读后感
  14. 鸿蒙出来后H5足以取代原生app
  15. 关于换行以及换行属性
  16. 佛山市政携手企企通,打造高效协同的云端极速供应链
  17. 【读书笔记】高效能人士的七个习惯
  18. 河南省计算机专业三本排名2015,河南三本大学排名【最新排行榜】
  19. CPU 与 Memory 内存之间的三级缓存的实现原理
  20. 地图投影之UTM和高斯克里格投影

热门文章

  1. Webstorm汉字乱码时
  2. Android修行手册 -初识Chip
  3. 博图v15编程手册_好消息!全套西门子plc编程软件,案例和说明书下载
  4. java大佬用什么编辑器_大佬们都在用的几款简单易用的文本编辑器
  5. 维纳(Wiener)滤波及Matlab代码
  6. multisim10元件库介绍
  7. Android ContactsProvider源码分析
  8. 无线系列-无线通信系统组成
  9. tcp协议可以提供什么服务器,什么是TCP协议?
  10. 计算机网络安全工作台账,网络安全工作自查报告(2)