李杰 武宏剛



摘要:基于我國自主可控的版式文檔格式標準(OFD),對OFD電子文檔的全流程流轉進行研究。從客戶化開發的角度研究做成、流轉、審核、查看、打印、保密的可實現方式。
關鍵詞:版式文檔;OFD;客戶化開發;數字簽名;水印;分發
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)08-0090-03
1 引言
版式文檔與流式文檔是兩種不同的文檔格式。流式文檔以微軟的Word文檔為例,其內容以流式的方式進行版面編排與內容展示,在中間插入新的內容會導致其后面的內容 “流”到新的位置。流式文檔在不同的軟硬件環境下展示出來的效果可能會發生變化,即“跑版”的現象;版式文檔版面固定、所見即所得,在不同的軟硬件下均呈現相同的效果,不會發生流式文檔的“跑版”現象,最終展現效果與紙質文件保持一致,是計算機時代的“數字紙張” [1]。
PDF(Portable Document Format) 作為ISO 32000標準,在全世界被廣泛采用;在國內,新型的版式文檔格式OFD(Open Fixed— layout Document)作為國家標準試點后快速推廣。 2016年10月,OFD作為國家標準(GB/T 33190-2016)正式發布,各地紛紛采用OFD格式對電子公文進行歸檔。
在技術層面上OFD有更多優勢:1)OFD格式采用GB/T 18793-2002中的XML技術描述文檔數據[2],格式開放、體系簡單、數據結構化,最終文件體積更加精簡;2)OFD格式擁有完全自主知識產權,不受控于外部廠商,有自主話語權。在標準特性上可進行擴展,滿足不同領域的應用需求;3)OFD標準支持國產密碼算法,在文檔安全性上有更多的可控保證。
基于OFD的格式特點,越來越多的公文、檔案、證照、執照、單證憑據開始使用OFD格式作為流轉或長期保存的格式[3]。同樣,針對企業不同的生產模式,企業內需廣泛流傳、長期保存的各種版式電子文檔,也可以采用OFD格式做成。
2 OFD與PDF的比較
OFD與PDF兩種版式文檔之間有很多相似之處。
2.1 表現
二者均為版式文檔格式,在應用層面上兩者有相同的定位[4]。
2.2 標準
OFD與PDF的格式標準均完全開放, OFD為國家標準,擁有完全自主知識產權。
2.3 生成方式
OFD和PDF文件生成方式相同,均可通過以下方式生成:1)通過軟件生成空白的OFD或PDF文檔,再通過軟件提供的功能向文檔中添加內容;2)通過成熟產品的虛擬打印機將受支持格式的電子數據,打印轉換成所需文檔;3)經由掃描設備將紙質文件轉換成所需文檔。
2.4 使用體驗
OFD與PDF均為版式文檔,在文檔的全生命周期中不同軟件提供的解決方案體驗大致相同。無論是文檔生成階段、流轉閱讀階段、保存歸檔階段,針對兩種格式的解決方案均提供閱讀器、注釋工具、安全工具等功能模塊,用戶針對不同格式的切換幾乎沒有學習成本。
2.5 適用場景
大多數使用PDF文檔的場景都可用OFD文檔替代。
3 全流程各階段的實現方式
企業內電子文檔全流程包括圖紙文檔的做成、審核、查看、打印,保存,以及各階段的安全保密需求。
3.1 文檔的生成
生成OFD文件的途徑主要包括使用成熟的OFD生成器或按照標準接口自行開發。
例如福昕出品的OFD軟件,可批量將多種格式的電子文檔轉換成ODF文件。在快速生成OFD文件的同時又保持版面的原樣。
如果采用開發的方式,可以使用開源的“OFD Reader & Writer” [5]庫創建文檔實體,并填入內容,此類庫對多項方法進行了封裝,使用方便,創建文檔示例如下:
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文檔可以根據企業內部的實際流程及使用需求,定制化開發軟件。通過移動、拷貝等方式實現內部的審核流轉流程。在流轉過程中,可通過OFD格式的原筆跡簽批、電子印章、數字簽名等技術實現防偽。
以數科OFD閱讀器產品為例,可通過產品提供的簽批功能進行手寫簽批。
另外,OFD文檔可以實現多種電子印章功能,并可對電子印章進行驗證,在文檔的審核過程中有效的防止篡改、抵賴、保護審批流程的安全性。
如果采用客戶化開發的方式,可以使用開源的“OFD Reader & Writer”庫實現客戶化的簽名功能,例如采用以下方式創建:
public static void main() throws Exception {
Path src = Paths.get("src/test/resources", "helloworld.ofd");
Path out = Paths.get("target/DigitalSign.ofd");
// 1. 構造簽名引擎
try (OFDReader reader = new OFDReader(src);
OFDSigner signer = new OFDSigner(reader, out)) {
// 2. 實現電子簽章容器
ExtendSignatureContainer signContainer = new YouImpContainer();
// 3. 設置簽名模式
//? signer.setSignMode(SignMode.WholeProtected);
signer.setSignMode(SignMode.ContinueSign);
// 4. 設置簽名使用的擴展簽名容器
signer.setSignContainer(signContainer);
// 5. 執行簽名
signer.exeSign();
// 6. 關閉簽名引擎,生成文檔。
}
System.out.println(out.toAbsolutePath().toAbsolutePath());
}
生成的簽名同樣可以驗證,防止篡改:
try (OFDReader reader = new OFDReader(src);
OFDValidator validator = new OFDValidator(reader)) {
// 1. 實現驗證容器
SignedDataValidateContainer dsc = new YouImpContainer(cert);
// 2. 實現驗證容器
validator.setValidator(dsc);
// 3. 執行驗簽驗章
validator.exeValidate();
// 4. 如果沒有異常拋出說明驗證成功。
}
3.3 文檔的查看
OFD有多款成熟的閱讀器,閱讀體驗與PDF沒有太大的差別,學習成本較低。閱讀器可對OFD文檔進行注釋、標注或者文檔頁面進行操作。
閱讀器也提供了多種主流瀏覽器的插件,除了在B/S結構中展示,也可以集成到C/S架構中。無論程序采用何種架構進行客戶化開發,都能實現閱讀查看功能。
3.4 文檔的打印
對于OFD文檔,要實現打印功能,可以通過閱讀器提供的打印功能將文檔打印成紙質介質或者其他格式的電子文檔,客戶化開發中也可以通過調用系統API執行打印功能。
3.5 文檔的歸檔與分發
OFD文檔的保存方式與PDF文檔相同,在文檔審閱完成后即可歸檔并提供查閱功能。對于需要對外分發的文檔,可以使用成熟產品提供分發保護,也可以通過SDK在客戶化的程序中實現密碼加密、添加水印等自動化操作。OFD 支持國產密碼算法及國際密碼算法,可有效的防止信息被竊取。
可以使用開源的“OFD Reader & Writer”庫在客戶化程序中添加水印,實現方式如下:
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());
}
}
除水印外,還可采用密碼加密、打印控制、遮蔽信息等方式對文檔進行保護。加密技術包括密碼加密和證書加密。密碼加密可根據需求采用SM系列國密算法,或AES、RC4等國際算法;證書加密通過數字證書對文檔進行加密,同樣可以根據需求采用SM系列國密算法,或AES、RC4、 SHA1、SHA256、RSA等國際算法。除此之外主流的保護手段OFD格式文檔基本都支持[6]。
4 基于OFD的開發
OFD格式采用XML標記語言描述,并采用開放標準。通過參考OFD的標準,可以實現以OFD文檔為載體的客戶化定制,在開發語言選擇上也比較豐富,主流的C++,C#,JAVA,PYTHON等均可進行開發。同時也有較多的開源庫可供引用,在定制開發上有很大的靈活性及開放性。
5 結束語
通過對OFD格式及現有成熟解決方案的研究,OFD文檔在自主知識產權、技術門檻、數據化結構、網絡傳輸、拓展性、定制化上有一定優勢,并且與PDF格式具有很多共性,學習轉移成本低。在“自主可控”“國產化替代”的發展趨勢下,通過采用OFD格式替代PDF格式,完全可以無縫平移地實現企業內部電子文檔客戶化全流程流轉。
參考文獻:
[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].信息技術與標準化,2016(10):45-48.
[5] Github.ofdwr[EB/OL].[2021-10-15].https://github.com/Trisia/ofdrw.
[6] 馮輝,陳留勇,樊孝龍,等.OFD的安全應用分析[J].信息技術與標準化,2017(11):49-53.
【通聯編輯:梁書】