函的特点
函是一种平行文,不能用于上下级机关,常用于不相隶属机关之间商洽工作、询问和答复问题、请求批准和答复审批事项。函可用于不相隶属机关相互商洽工作、询问和答复问题;向有关主管部门请求批准事项;向上级机关询问具体事项;上级机关答复下级机关的询问或请求批准事项;上级机关催办下级机关有关事宜;上级机关对某件原发文件做较小的补充或更正。
函对发文机关的资格要求很宽松,高层机关、基层单位、党政机关、社会团体、企事业单位均可发函,内容和格式也比较灵活。函的内容必须单一,一份函只能写一件事项,强调实用。函具有平等性和沟通性、灵活性和广泛性、单一性和实用性等特征。从函所起的作用,可划分为告知函、商洽函、询问函、答复函和请批函5种。按发文目的不同,函可以分为发函和复函2种。发函即主动提出公事事项所发出的函。复函是被动的,用于答复商洽、询问的问题或批准有关单位的请求事项。
函的格式比较独特,但总体来说,函的主体格式由标题、主送机关、正文、发文机关署名、成文日期等要素组成。
显示效果
示例代码所生成的OFD文件:下载
示例代码
package test.create.c12;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.bouncycastle.asn1.ASN1BitString;
import org.bouncycastle.asn1.DERBitString;
import iofd.layout.signature.SignatureRequest;
import iofd.official.OfficialDocument;
import iofd.official.gbt9704.bean.SealInfo;
import iofd.official.gbt9704.contants.OfficialDocumentType;
import iofd.pki.core.asn1.SM2Signature;
import iofd.pki.core.sm2.Sm2Signer;
import iofd.signature.OfdSignatureHelper;
import iofd.signature.OfdSignatureHelper.DigestInfo;
import iofd.signature.asn1.seal.SeSeal;
import test.create.TestDocUtil;
import test.create.c11.C1101SealHelloWorld;
/**
* 公文:函
* */
public class C1214Han {
public static void main(String[] args) throws Throwable {
C1214Han o = new C1214Han();
o.done();
}
private void done() throws Throwable {
String clzName = this.getClass().getSimpleName();
System.out.println(clzName + " begin");
OfficialDocument official = new OfficialDocument(OfficialDocumentType.HAN);
official.setIssuerAgency("测试符食品药品监督管理局");
official.setIssueNum("×××〔××××〕×号");
official.setTitles("关于违法提供食品经营场所的告知函");
List mainSend = new ArrayList<>();
mainSend.add("测试测试大学");
official.setMainSend(mainSend);
official.addContent("经过我局执法人员调查核实,位于广州市测试符五山路483号某大学三角市的西园食堂快餐部等22家单位(见附件)存在未取得食品经营许可从事食品经营活动,违反了《中华人民共和国食品安全法》第三十五条第一款的规定,国家对食品生产经营实行许可制度。我局拟依法对其无证照经营食品的违法行为作出行政处罚。");
official.addContent("现已查实,上述无证照经营企业场所为贵单位所属物业。依照《中华人民共和国食品安全法》第一百二十二条第二款的规定,明知从事前款规定的违法行为,仍为其提供生产经营场所或者其他条件的,由县级以上人民政府食品药品监督管理部门责令停止违法行为,没收违法所得,并处五万元以上十万元以下罚款;使消费者的合法权益受到损害的,应当与食品、食品添加剂生产经营者承担连带责任。");
official.addContent("请贵单位按照《中华人民共和国食品安全法》的有关规定,自本告知函送达之日起20个工作日内,立即采取有效措施终止上述违法行为,以消除食品安全隐患。若贵单位在规定的时限内未终止违法行为,我局将依照《中华人民共和国食品安全法》第一百二十二条第二款之规定做出行政处罚。");
official.addContent("专此函达。");
List sealList = new ArrayList<>();
SealInfo info = new SealInfo();
info.setName("测试符食品药品监督管理局");
info.setDate("2016年05月31日");
info.setSeal(C1101SealHelloWorld.SEAL1);
sealList.add(info);
official.setSeals(sealList);
List ccSends = new ArrayList<>();
ccSends.add("××××××");
ccSends.add("××××××");
ccSends.add("×××××××××××××");
ccSends.add("××××××");
ccSends.add("××××××");
official.setCcSends(ccSends);
String digestFileName = TestDocUtil.getOfdFilePath(this.getClass(), "_digest", false);
String finalFileName = TestDocUtil.getOfdFilePath(this.getClass(), false);
official.save(finalFileName);
List signReqList = official.getSignatureRequestList();
for(int i = 0; signReqList != null && i < signReqList.size(); i++) {
File ofdFile = new File(finalFileName);
File digestFile = new File(digestFileName);
File finalFile = new File(finalFileName);
SignatureRequest req = signReqList.get(i);
SeSeal seSeal = req.getSeal();
OfdSignatureHelper helper = OfdSignatureHelper.newInstance();
DigestInfo digestInfo = helper.createSm3Digest(ofdFile, digestFile, C1101SealHelloWorld.pubKey, seSeal, req.getBoundary(), req.getClip(), req.getPageRef());
byte[] digest = digestInfo.getDigest();
/*
* 注意:这部分应该使用可靠的签名设备
* */
Sm2Signer signer = new Sm2Signer();
SM2Signature sign = signer.signWithHash(C1101SealHelloWorld.priKey, digest);
byte[] signature = sign.getEncoded();
int signVersion = 1;
ASN1BitString dataHash = new DERBitString(digest);
ASN1BitString timeInfo = null;//时间戳
helper.createSm2Signature(digestInfo.getSignatureRoot(), signature, seSeal, C1101SealHelloWorld.pubKey,
C1101SealHelloWorld.cert, signVersion, dataHash, timeInfo, digestFile, finalFile);
}
System.out.println(clzName + " end");
}
}