如何生成打印模板pdf文件绑定到附件面板中原创
金蝶云社区-陈来珍
陈来珍
8人赞赏了该文章 4,178次浏览 未经作者许可,禁止转载编辑于2022年10月14日 15:52:01
summary-icon摘要由AI智能服务提供

本文介绍了在采购订单提交时,自动生成对应打印模板的PDF文件并绑定到附件面板的需求、思路、实现过程及效果。通过调用打印模板接口获取PDF文件路径,构建附件信息后上传至附件面板。实现步骤包括新增打印模板、编写插件代码以在事务开始前生成PDF并上传附件。最后展示了成功提交采购订单后,附件面板中生成PDF文件的效果,并提供了开发环境版本、注意事项及参考资料。

关键词:

打印模板、pdf文件、附件面板

一、需求

在采购订单(kded_oderbill)中,采购订单提交时,生成采购订单对应打印模板的pdf文件,并绑定到附件面板中。

二、思路与方案

首先,在提交操作的操作服务插件中,根据打印模板的接口https://vip.kingdee.com/article/267356926411609344获取到打印模板的pdf文件的路径。然后构建的附件面板的信息(包括附件修改事件、附件大小等),最后通过附件的上传接口,上传附件到单据的附件面板中。

三、实现过程

1、新增打印模板

在系统服务云-配置工具-打印配置-维护打印模板中新增一个采购订单打印模板。

d1.png

2、代码实现过程

(1)新增插件OderOppSubmitServicePlugin,继承AbstractOperationServicePlugIn,注册到提交操作的服务插件中

d2.png

(2)操作校验通过,开启了事务之后,还没有把数据提交到数据库之前beginOperationTransaction事件中实现生成打印模板的pdf文件并绑定到附件面板的过程

public class OderOppSubmitServicePlugin extends AbstractOperationServicePlugIn {

	/**
	 * 执行操作校验前,触发此事件
	 * 提交时,生成打印模板的pdf文件绑定到附件面板中
	 * @remark
	 *
	 */
	@Override
	public void beginOperationTransaction(BeginOperationTransactionArgs e) {

		for (DynamicObject obj : e.getDataEntities()) {
			ArrayList<Object> pkIds = new ArrayList<>();
			pkIds.add(obj.getPkValue());
			// 打印任务
			ArrayList<PrintTask> taskList = new ArrayList<>();
			PrintTask printTask = new PrintTask();
			DynamicObject queryOne = QueryServiceHelper.queryOne("bos_print_meta", "id",
					new QFilter[] { new QFilter("number", QCP.equals, "kded_oderbill_prtpl") });
			if (queryOne == null) {
				return;
			}
			printTask.setTplId(queryOne.getString("id"));// 打印模板的id
			printTask.setPkIds(pkIds);
			printTask.setPrintType("billForm");// 打印对象的类型,是单据(billForm),报表(report),还是动态表单(dynamic)
			String formId = obj.getDataEntityType().getName();
			printTask.setFormId(formId);
			taskList.add(printTask);
			// 打印作业
			PrintWork printWork = new PrintWork();
			printWork.setPrintLang("zh_CN");// 简体中文
			printWork.setExpType("pdf");
			printWork.setTaskList(taskList);
			//生成打印模板生成的pdf文件
			PrtAttach doPrint = BosPrintServiceHelper.doPrint(printWork);
			List<AttachDetail> attachDetails = doPrint.getAttachDetail();
			AttachDetail attachDetail = attachDetails.get(0);

			// 将文件保存到附件
			List<Map<String, Object>> atts = new ArrayList<Map<String, Object>>();
			atts.add(createAttInfo(attachDetail,obj.getString("billno")));
			//上传附件到采购订单的附件面板中
			AttachmentServiceHelper.upload(formId, obj.getPkValue(), "attachmentpanel", atts);
		}

		super.beginOperationTransaction(e);
	}
    //构建附件面板信息
	private Map<String, Object> createAttInfo(AttachDetail attachDetail, String billno) {

		Map<String, Object> att = new HashMap<String, Object>();
		// 当前时间戳
		long time = new Date().getTime();

		att.put("createdate", time);
		// lastModified:时间戳
		att.put("lastModified", time);
		att.put("status", "success");
		String attType = attachDetail.getFileType();
		att.put("type", attType);
		// name:文件名(含文件格式)
		att.put("name", billno+attachDetail.getFileName());
		FileService fs = FileServiceFactory.getAttachmentFileService();
		InputStream in = fs.getInputStream(attachDetail.getFilePath());
		try {
			// 附件大小
			byte[] AttByte = InputStreamToByte(in);
			att.put("size", AttByte.length);
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		StringBuffer uid = new StringBuffer();
		uid.append("rc-upload-");
		uid.append(time);
		uid.append("-");
		uid.append("1");
		att.put("uid", uid.toString());
		att.put("url", attachDetail.getFilePath());
		return att;
	}

	// ImputStream输入流转二进制数据
	public byte[] InputStreamToByte(InputStream in) throws IOException {
		ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
		int ch;
		while ((ch = in.read()) != -1) {
			bytestream.write(ch);
		}
		byte imgdata[] = bytestream.toByteArray();
		bytestream.close();
		return imgdata;
	}

}

四、效果图

点击提交,提交成功,可以看到附件已经生成并绑定采购订单的附件面板中。

d3.png

五、开发环境版本

V5.0.002

六、注意事项

该打印模板是新的打印模板(苍穹4.0之后的版本)。

可以从下面的附件中导入打印模板的元数据到自己本地环境。

七、参考资料

【开发平台】指导手册

学习成长中心


图标赞 8
8人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0