李杰 武宏剛
摘要:基于我國自主可控的版式文檔格式標準(OFD),對OFD電子文檔的全流程流轉(zhuǎn)進行研究。從客戶化開發(fā)的角度研究做成、流轉(zhuǎn)、審核、查看、打印、保密的可實現(xiàn)方式。
關(guān)鍵詞:版式文檔;OFD;客戶化開發(fā);數(shù)字簽名;水印;分發(fā)
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)08-0090-03
1 引言
版式文檔與流式文檔是兩種不同的文檔格式。流式文檔以微軟的Word文檔為例,其內(nèi)容以流式的方式進行版面編排與內(nèi)容展示,在中間插入新的內(nèi)容會導致其后面的內(nèi)容 “流”到新的位置。流式文檔在不同的軟硬件環(huán)境下展示出來的效果可能會發(fā)生變化,即“跑版”的現(xiàn)象;版式文檔版面固定、所見即所得,在不同的軟硬件下均呈現(xiàn)相同的效果,不會發(fā)生流式文檔的“跑版”現(xiàn)象,最終展現(xiàn)效果與紙質(zhì)文件保持一致,是計算機時代的“數(shù)字紙張” [1]。
PDF(Portable Document Format) 作為ISO 32000標準,在全世界被廣泛采用;在國內(nèi),新型的版式文檔格式OFD(Open Fixed— layout Document)作為國家標準試點后快速推廣。 2016年10月,OFD作為國家標準(GB/T 33190-2016)正式發(fā)布,各地紛紛采用OFD格式對電子公文進行歸檔。
在技術(shù)層面上OFD有更多優(yōu)勢:1)OFD格式采用GB/T 18793-2002中的XML技術(shù)描述文檔數(shù)據(jù)[2],格式開放、體系簡單、數(shù)據(jù)結(jié)構(gòu)化,最終文件體積更加精簡;2)OFD格式擁有完全自主知識產(chǎn)權(quán),不受控于外部廠商,有自主話語權(quán)。在標準特性上可進行擴展,滿足不同領(lǐng)域的應用需求;3)OFD標準支持國產(chǎn)密碼算法,在文檔安全性上有更多的可控保證。
基于OFD的格式特點,越來越多的公文、檔案、證照、執(zhí)照、單證憑據(jù)開始使用OFD格式作為流轉(zhuǎn)或長期保存的格式[3]。同樣,針對企業(yè)不同的生產(chǎn)模式,企業(yè)內(nèi)需廣泛流傳、長期保存的各種版式電子文檔,也可以采用OFD格式做成。
2 OFD與PDF的比較
OFD與PDF兩種版式文檔之間有很多相似之處。
2.1 表現(xiàn)
二者均為版式文檔格式,在應用層面上兩者有相同的定位[4]。
2.2 標準
OFD與PDF的格式標準均完全開放, OFD為國家標準,擁有完全自主知識產(chǎn)權(quán)。
2.3 生成方式
OFD和PDF文件生成方式相同,均可通過以下方式生成:1)通過軟件生成空白的OFD或PDF文檔,再通過軟件提供的功能向文檔中添加內(nèi)容;2)通過成熟產(chǎn)品的虛擬打印機將受支持格式的電子數(shù)據(jù),打印轉(zhuǎn)換成所需文檔;3)經(jīng)由掃描設備將紙質(zhì)文件轉(zhuǎn)換成所需文檔。
2.4 使用體驗
OFD與PDF均為版式文檔,在文檔的全生命周期中不同軟件提供的解決方案體驗大致相同。無論是文檔生成階段、流轉(zhuǎn)閱讀階段、保存歸檔階段,針對兩種格式的解決方案均提供閱讀器、注釋工具、安全工具等功能模塊,用戶針對不同格式的切換幾乎沒有學習成本。
2.5 適用場景
大多數(shù)使用PDF文檔的場景都可用OFD文檔替代。
3 全流程各階段的實現(xiàn)方式
企業(yè)內(nèi)電子文檔全流程包括圖紙文檔的做成、審核、查看、打印,保存,以及各階段的安全保密需求。
3.1 文檔的生成
生成OFD文件的途徑主要包括使用成熟的OFD生成器或按照標準接口自行開發(fā)。
例如福昕出品的OFD軟件,可批量將多種格式的電子文檔轉(zhuǎn)換成ODF文件。在快速生成OFD文件的同時又保持版面的原樣。
如果采用開發(fā)的方式,可以使用開源的“OFD Reader & Writer” [5]庫創(chuàng)建文檔實體,并填入內(nèi)容,此類庫對多項方法進行了封裝,使用方便,創(chuàng)建文檔示例如下:
public class HelloWorld {
public static void main(String[] args) throws IOException {
Path path = Paths.get("HelloWorld.ofd");
try (OFDDoc ofdDoc = new OFDDoc(path)) {
Paragraph p = new Paragraph("Hello World!");
ofdDoc.add(p);
}
System.out.println(path.toAbsolutePath());
}
}
3.2 文檔的審核
OFD文檔可以根據(jù)企業(yè)內(nèi)部的實際流程及使用需求,定制化開發(fā)軟件。通過移動、拷貝等方式實現(xiàn)內(nèi)部的審核流轉(zhuǎn)流程。在流轉(zhuǎn)過程中,可通過OFD格式的原筆跡簽批、電子印章、數(shù)字簽名等技術(shù)實現(xiàn)防偽。
以數(shù)科OFD閱讀器產(chǎn)品為例,可通過產(chǎn)品提供的簽批功能進行手寫簽批。
另外,OFD文檔可以實現(xiàn)多種電子印章功能,并可對電子印章進行驗證,在文檔的審核過程中有效的防止篡改、抵賴、保護審批流程的安全性。
如果采用客戶化開發(fā)的方式,可以使用開源的“OFD Reader & Writer”庫實現(xiàn)客戶化的簽名功能,例如采用以下方式創(chuàng)建:
public static void main() throws Exception {
Path src = Paths.get("src/test/resources", "helloworld.ofd");
Path out = Paths.get("target/DigitalSign.ofd");
// 1. 構(gòu)造簽名引擎
try (OFDReader reader = new OFDReader(src);
OFDSigner signer = new OFDSigner(reader, out)) {
// 2. 實現(xiàn)電子簽章容器
ExtendSignatureContainer signContainer = new YouImpContainer();
// 3. 設置簽名模式
//? signer.setSignMode(SignMode.WholeProtected);
signer.setSignMode(SignMode.ContinueSign);
// 4. 設置簽名使用的擴展簽名容器
signer.setSignContainer(signContainer);
// 5. 執(zhí)行簽名
signer.exeSign();
// 6. 關(guān)閉簽名引擎,生成文檔。
}
System.out.println(out.toAbsolutePath().toAbsolutePath());
}
生成的簽名同樣可以驗證,防止篡改:
try (OFDReader reader = new OFDReader(src);
OFDValidator validator = new OFDValidator(reader)) {
// 1. 實現(xiàn)驗證容器
SignedDataValidateContainer dsc = new YouImpContainer(cert);
// 2. 實現(xiàn)驗證容器
validator.setValidator(dsc);
// 3. 執(zhí)行驗簽驗章
validator.exeValidate();
// 4. 如果沒有異常拋出說明驗證成功。
}
3.3 文檔的查看
OFD有多款成熟的閱讀器,閱讀體驗與PDF沒有太大的差別,學習成本較低。閱讀器可對OFD文檔進行注釋、標注或者文檔頁面進行操作。
閱讀器也提供了多種主流瀏覽器的插件,除了在B/S結(jié)構(gòu)中展示,也可以集成到C/S架構(gòu)中。無論程序采用何種架構(gòu)進行客戶化開發(fā),都能實現(xiàn)閱讀查看功能。
3.4 文檔的打印
對于OFD文檔,要實現(xiàn)打印功能,可以通過閱讀器提供的打印功能將文檔打印成紙質(zhì)介質(zhì)或者其他格式的電子文檔,客戶化開發(fā)中也可以通過調(diào)用系統(tǒng)API執(zhí)行打印功能。
3.5 文檔的歸檔與分發(fā)
OFD文檔的保存方式與PDF文檔相同,在文檔審閱完成后即可歸檔并提供查閱功能。對于需要對外分發(fā)的文檔,可以使用成熟產(chǎn)品提供分發(fā)保護,也可以通過SDK在客戶化的程序中實現(xiàn)密碼加密、添加水印等自動化操作。OFD 支持國產(chǎn)密碼算法及國際密碼算法,可有效的防止信息被竊取。
可以使用開源的“OFD Reader & Writer”庫在客戶化程序中添加水印,實現(xiàn)方式如下:
public void addWatermark() throws IOException {
Path srcP = Paths.get("src/test/resources", "AddAttachment.ofd");
Path outP = Paths.get("target/AddWatermarkAnnot.ofd");
try (OFDReader reader = new OFDReader(srcP);
OFDDoc ofdDoc = new OFDDoc(reader, outP)) {
Double width = ofdDoc.getPageLayout().getWidth();
Double height = ofdDoc.getPageLayout().getHeight();
Annotation annotation = new Annotation(new ST_Box(0d, 0d, width, height), AnnotType.Watermark, ctx -> {
FontSetting setting = new FontSetting(8, FontName.SimSun.font());
ctx.setFillColor(170, 160, 165)
.setFont(setting)
.setGlobalAlpha(0.4);
for (int i = 0; i <= 8; i++) {
for (int j = 0; j <= 8; j++) {
ctx.save();
ctx.translate(22.4 * i, j * 50);
ctx.rotate(45);
ctx.fillText("保密", 10, 10);
ctx.restore();
}
}
});
ofdDoc.addAnnotation(1, annotation);
}
System.out.println(outP.toAbsolutePath().toString());
}
}
除水印外,還可采用密碼加密、打印控制、遮蔽信息等方式對文檔進行保護。加密技術(shù)包括密碼加密和證書加密。密碼加密可根據(jù)需求采用SM系列國密算法,或AES、RC4等國際算法;證書加密通過數(shù)字證書對文檔進行加密,同樣可以根據(jù)需求采用SM系列國密算法,或AES、RC4、 SHA1、SHA256、RSA等國際算法。除此之外主流的保護手段OFD格式文檔基本都支持[6]。
4 基于OFD的開發(fā)
OFD格式采用XML標記語言描述,并采用開放標準。通過參考OFD的標準,可以實現(xiàn)以OFD文檔為載體的客戶化定制,在開發(fā)語言選擇上也比較豐富,主流的C++,C#,JAVA,PYTHON等均可進行開發(fā)。同時也有較多的開源庫可供引用,在定制開發(fā)上有很大的靈活性及開放性。
5 結(jié)束語
通過對OFD格式及現(xiàn)有成熟解決方案的研究,OFD文檔在自主知識產(chǎn)權(quán)、技術(shù)門檻、數(shù)據(jù)化結(jié)構(gòu)、網(wǎng)絡傳輸、拓展性、定制化上有一定優(yōu)勢,并且與PDF格式具有很多共性,學習轉(zhuǎn)移成本低。在“自主可控”“國產(chǎn)化替代”的發(fā)展趨勢下,通過采用OFD格式替代PDF格式,完全可以無縫平移地實現(xiàn)企業(yè)內(nèi)部電子文檔客戶化全流程流轉(zhuǎn)。
參考文獻:
[1] 百度百科.版式文檔[EB/OL].[2021-10-15].https://baike.baidu.com/item/%E7%89%88%E5%BC%8F%E6%96%87%E6%A1%A3/6845753?fr=aladdin.
[2] GB/T 33190-2016,電子文件存儲與交換格式 版式文檔[S].
[3] 王姝,徐華,王少康.OFD版式文檔應用研究[J].檔案學研究,2019(1):95-100.
[4] 馮輝,李海波,叢培勇,等.OFD與PDF對比分析[J].信息技術(shù)與標準化,2016(10):45-48.
[5] Github.ofdwr[EB/OL].[2021-10-15].https://github.com/Trisia/ofdrw.
[6] 馮輝,陳留勇,樊孝龍,等.OFD的安全應用分析[J].信息技術(shù)與標準化,2017(11):49-53.
【通聯(lián)編輯:梁書】