差旅报销单发票、附件打印-龚宇杰
This commit is contained in:
parent
37f456ac38
commit
dec83ac3db
|
@ -0,0 +1,296 @@
|
||||||
|
package zf47.jdgz1.fi.em.plugin.print;
|
||||||
|
|
||||||
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
|
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
||||||
|
import kd.bos.fileservice.FileItem;
|
||||||
|
import kd.bos.fileservice.FileService;
|
||||||
|
import kd.bos.fileservice.FileServiceFactory;
|
||||||
|
import kd.bos.logging.Log;
|
||||||
|
import kd.bos.logging.LogFactory;
|
||||||
|
import kd.bos.orm.query.QCP;
|
||||||
|
import kd.bos.orm.query.QFilter;
|
||||||
|
import kd.bos.print.core.data.DataRowSet;
|
||||||
|
import kd.bos.print.core.data.field.ImageField;
|
||||||
|
import kd.bos.print.core.plugin.AbstractPrintPlugin;
|
||||||
|
import kd.bos.print.core.plugin.event.CustomDataLoadEvent;
|
||||||
|
import kd.bos.print.core.plugin.event.EndExportEvent;
|
||||||
|
import kd.bos.service.attachment.FilePathService;
|
||||||
|
import kd.bos.servicehelper.AttachmentServiceHelper;
|
||||||
|
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
||||||
|
import kd.bos.url.UrlService;
|
||||||
|
import kd.sdk.plugin.Plugin;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
|
import org.apache.pdfbox.rendering.ImageType;
|
||||||
|
import org.apache.pdfbox.rendering.PDFRenderer;
|
||||||
|
import org.ofdrw.converter.ImageMaker;
|
||||||
|
import org.ofdrw.reader.OFDReader;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.awt.image.AffineTransformOp;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新的打印插件
|
||||||
|
*/
|
||||||
|
public class TripReimbursePrintPlugin extends AbstractPrintPlugin implements Plugin {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 差旅报销单-发票、附件打印
|
||||||
|
* */
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(TripReimbursePrintPlugin.class);
|
||||||
|
private final String PrintNum = null;//单据打印模板编号
|
||||||
|
private static HashSet<String> deleteUrl = new HashSet<>();
|
||||||
|
//自定义数据源标识
|
||||||
|
private static final String CUSTOM_DS = "imageDs";
|
||||||
|
//主数据源标识(差旅报销单formId)
|
||||||
|
private static final String MAIN_DS = "er_tripreimbursebill";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadCustomData(CustomDataLoadEvent evt) {
|
||||||
|
List<DataRowSet> customDataRows = evt.getCustomDataRows();
|
||||||
|
//加载自定义数据源,根据关联关系查询出上游单据中图片地址,构造自定义数据源数据包
|
||||||
|
if (CUSTOM_DS.equals(evt.getDataSource().getDsName())) {
|
||||||
|
log.info(evt.getDataSource().getDsName());
|
||||||
|
//拿源单类型
|
||||||
|
Object pkId = evt.getDataSource().getPkId();
|
||||||
|
DynamicObject bill = BusinessDataServiceHelper.loadSingle(pkId, MAIN_DS);
|
||||||
|
if (bill != null) {
|
||||||
|
long billId = bill.getLong("id");
|
||||||
|
//发票信息分录
|
||||||
|
DynamicObjectCollection srcInvEntries = bill.getDynamicObjectCollection("invoiceentry");
|
||||||
|
if (srcInvEntries != null && !srcInvEntries.isEmpty()) {
|
||||||
|
for (DynamicObject srcInvEntry : srcInvEntries) {
|
||||||
|
String serialNo = srcInvEntry.getString("serialno");//发票序列号
|
||||||
|
QFilter qInvFile = new QFilter("serial_no", QCP.equals, serialNo);
|
||||||
|
DynamicObject[] invFiles = BusinessDataServiceHelper.load("rim_invoice_file",
|
||||||
|
"image_url", new QFilter[]{qInvFile});
|
||||||
|
for (DynamicObject invFile : invFiles) {
|
||||||
|
String url = invFile.getString("image_url");
|
||||||
|
if (StringUtils.isNotBlank(url)) {
|
||||||
|
ArrayList<String> handleUrls = handlePicAttUrl(url);
|
||||||
|
for (String handleUrl : handleUrls) {
|
||||||
|
DataRowSet dataRowSet = new DataRowSet();
|
||||||
|
ImageField imageField = new ImageField(handleUrl);
|
||||||
|
dataRowSet.put("imageUrl", imageField);
|
||||||
|
customDataRows.add(dataRowSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//获取源单的附件
|
||||||
|
List<Map<String, Object>> attachments = AttachmentServiceHelper.getAttachments(MAIN_DS, billId, "attachmentpanel");
|
||||||
|
//遍历文件
|
||||||
|
for (Map<String, Object> att : attachments) {
|
||||||
|
String relativeUrl = (String) att.get("relativeUrl");
|
||||||
|
String attType = (String) att.get("type");
|
||||||
|
if ("jpg".equalsIgnoreCase(attType) || "jpeg".equalsIgnoreCase(attType) || "png".equalsIgnoreCase(attType)
|
||||||
|
|| "bmp".equalsIgnoreCase(attType) || "gif".equalsIgnoreCase(attType)) {
|
||||||
|
ArrayList<String> urls = handlePicAttUrl(relativeUrl);
|
||||||
|
if (!urls.isEmpty()) {
|
||||||
|
for (String s : urls) {
|
||||||
|
DataRowSet dataRowSet = new DataRowSet();
|
||||||
|
//根据图片地址信息构造图片字段,图片字段使用ImageField
|
||||||
|
ImageField imageField = new ImageField(s);
|
||||||
|
dataRowSet.put("imageUrl", imageField);
|
||||||
|
customDataRows.add(dataRowSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ("pdf".equalsIgnoreCase(attType)) {//PDF转图片
|
||||||
|
try {
|
||||||
|
ArrayList<String> pic = PDFtoPic(relativeUrl, "");
|
||||||
|
if (!pic.isEmpty()) {
|
||||||
|
for (String u : pic) {
|
||||||
|
DataRowSet dataRowSet = new DataRowSet();
|
||||||
|
//根据图片地址信息构造图片字段,图片字段使用ImageField
|
||||||
|
ImageField imageField = new ImageField(u);
|
||||||
|
dataRowSet.put("imageUrl", imageField);
|
||||||
|
customDataRows.add(dataRowSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
} else if ("ofd".equalsIgnoreCase(attType)) {//OFD转图片
|
||||||
|
try {
|
||||||
|
ArrayList<String> pic = OFDtoPic(relativeUrl);
|
||||||
|
if (!pic.isEmpty()) {
|
||||||
|
for (String u : pic) {
|
||||||
|
DataRowSet dataRowSet = new DataRowSet();
|
||||||
|
//根据图片地址信息构造图片字段,图片字段使用ImageField
|
||||||
|
ImageField imageField = new ImageField(u);
|
||||||
|
dataRowSet.put("imageUrl", imageField);
|
||||||
|
customDataRows.add(dataRowSet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> PDFtoPic(String url, String type) throws Exception {
|
||||||
|
ArrayList<String> resUrls = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
FileService fs = FileServiceFactory.getAttachmentFileService();
|
||||||
|
FilePathService fps = new FilePathService();
|
||||||
|
String realPath = fps.getRealPath(url);
|
||||||
|
String fileserver = System.getProperty("fileserver");
|
||||||
|
String abUrl = fileserver + realPath;
|
||||||
|
String abEncreptUrl = AttachmentServiceHelper.getEncreptURL(abUrl);
|
||||||
|
abEncreptUrl = abEncreptUrl.replaceAll("\\s", "%20").replaceAll("'", "%27");
|
||||||
|
//处理存储路径
|
||||||
|
String[] pathSplit = realPath.split("/");
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 1; i < pathSplit.length - 1; i++) {
|
||||||
|
sb.append("/").append(pathSplit[i]);
|
||||||
|
}
|
||||||
|
String oldFileName = pathSplit[pathSplit.length - 1];
|
||||||
|
String newFileName = "";
|
||||||
|
int index = oldFileName.lastIndexOf(".");
|
||||||
|
|
||||||
|
|
||||||
|
URL Url = new URL(abEncreptUrl);
|
||||||
|
HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
|
||||||
|
InputStream inputStream = conn.getInputStream();
|
||||||
|
if (inputStream.available() > 0) {
|
||||||
|
PDDocument document = PDDocument.load(inputStream);
|
||||||
|
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||||
|
for (int page = 0; page < document.getNumberOfPages(); ++page) {
|
||||||
|
if (index != -1) {
|
||||||
|
String oldFileNameSub = oldFileName.substring(0, index);
|
||||||
|
newFileName = oldFileNameSub + "-" + page + ".jpg";
|
||||||
|
}
|
||||||
|
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 1000, ImageType.RGB);
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
// 输出格式可以是 "jpg", "png" 等
|
||||||
|
if ("att".equals(type)) {
|
||||||
|
// 计算放大后的尺寸
|
||||||
|
int newWidth = bim.getWidth();
|
||||||
|
int newHeight = bim.getHeight();
|
||||||
|
// 高度大于宽度的图像进行90度旋转
|
||||||
|
if (newHeight > newWidth) {
|
||||||
|
BufferedImage rotatedImage = new BufferedImage(newHeight, newWidth, bim.getType());
|
||||||
|
AffineTransform tx = new AffineTransform();
|
||||||
|
tx.translate(newHeight / 2.0, newWidth / 2.0);
|
||||||
|
tx.rotate(Math.toRadians(90));
|
||||||
|
tx.translate(-newWidth / 2.0, -newHeight / 2.0);
|
||||||
|
|
||||||
|
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
|
||||||
|
op.filter(bim, rotatedImage);
|
||||||
|
ImageIO.write(rotatedImage, "JPG", outputStream);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ImageIO.write(bim, "jpg", outputStream);
|
||||||
|
}
|
||||||
|
inputStream.close();
|
||||||
|
StringBuilder newStBuild = new StringBuilder();
|
||||||
|
newStBuild.append(sb);
|
||||||
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray());
|
||||||
|
FileItem fileItem = new FileItem(newFileName, newStBuild.append("/").append(newFileName).toString(), byteArrayInputStream);
|
||||||
|
String upload = fs.upload(fileItem);
|
||||||
|
deleteUrl.add(upload);
|
||||||
|
String uploadUrl = UrlService.getAttachmentDownloadUrl(upload);
|
||||||
|
String uploadEncreptURL = AttachmentServiceHelper.getEncreptURL(uploadUrl);
|
||||||
|
byteArrayInputStream.close();
|
||||||
|
resUrls.add(uploadEncreptURL);
|
||||||
|
}
|
||||||
|
document.close();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("message" + e.getMessage());
|
||||||
|
}
|
||||||
|
return resUrls;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> OFDtoPic(String url) throws Exception {
|
||||||
|
ArrayList<String> resUrls = new ArrayList<>();
|
||||||
|
FileService fs = FileServiceFactory.getAttachmentFileService();
|
||||||
|
FilePathService fps = new FilePathService();
|
||||||
|
String realPath = fps.getRealPath(url);
|
||||||
|
String fileserver = System.getProperty("fileserver");
|
||||||
|
String abUrl = fileserver + realPath;
|
||||||
|
String abEncreptUrl = AttachmentServiceHelper.getEncreptURL(abUrl);
|
||||||
|
abEncreptUrl = abEncreptUrl.replaceAll("\\s", "%20").replaceAll("'", "%27");
|
||||||
|
//处理存储路径
|
||||||
|
String[] pathSplit = realPath.split("/");
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 1; i < pathSplit.length - 1; i++) {
|
||||||
|
sb.append("/").append(pathSplit[i]);
|
||||||
|
}
|
||||||
|
String oldFileName = pathSplit[pathSplit.length - 1];
|
||||||
|
String newFileName = "";
|
||||||
|
int index = oldFileName.lastIndexOf(".");
|
||||||
|
|
||||||
|
URL Url = new URL(abEncreptUrl);
|
||||||
|
HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
|
||||||
|
InputStream inputStream = conn.getInputStream();
|
||||||
|
if (inputStream.available() > 0) {
|
||||||
|
try (OFDReader reader = new OFDReader(inputStream);) {
|
||||||
|
inputStream.close();
|
||||||
|
ImageMaker imageMaker = new ImageMaker(reader, 15);
|
||||||
|
for (int i = 0; i < imageMaker.pageSize(); i++) {
|
||||||
|
if (index != -1) {
|
||||||
|
String oldFileNameSub = oldFileName.substring(0, index);
|
||||||
|
newFileName = oldFileNameSub + "-" + i + ".jpg";
|
||||||
|
}
|
||||||
|
// 4. 指定页码转换图片
|
||||||
|
BufferedImage image = imageMaker.makePage(i);
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
// 5. 存储为指定格式图片
|
||||||
|
ImageIO.write(image, "JPG", outputStream);
|
||||||
|
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray());
|
||||||
|
outputStream.close();
|
||||||
|
StringBuilder newStBuild = new StringBuilder();
|
||||||
|
newStBuild.append(sb);
|
||||||
|
FileItem fileItem = new FileItem(newFileName, newStBuild.append("/").append(newFileName).toString(), byteArrayInputStream);
|
||||||
|
String upload = fs.upload(fileItem);
|
||||||
|
deleteUrl.add(upload);
|
||||||
|
String uploadUrl = UrlService.getAttachmentDownloadUrl(upload);
|
||||||
|
String uploadEncreptURL = AttachmentServiceHelper.getEncreptURL(uploadUrl);
|
||||||
|
byteArrayInputStream.close();
|
||||||
|
resUrls.add(uploadEncreptURL);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("message" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resUrls;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> handlePicAttUrl(String url) {
|
||||||
|
ArrayList<String> urls = new ArrayList<>();
|
||||||
|
FilePathService fps = new FilePathService();
|
||||||
|
String realPath = fps.getRealPath(url);
|
||||||
|
String fileserver = System.getProperty("imageServer.external.url");
|
||||||
|
String abUrl = fileserver + realPath;
|
||||||
|
String abEncreptUrl = AttachmentServiceHelper.getEncreptURL(abUrl);
|
||||||
|
abEncreptUrl = abEncreptUrl.replaceAll("\\s", "%20").replaceAll("'", "%27");
|
||||||
|
urls.add(abEncreptUrl);
|
||||||
|
return urls;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endExport(EndExportEvent evt) {
|
||||||
|
super.endExport(evt);
|
||||||
|
FileService fs = FileServiceFactory.getAttachmentFileService();
|
||||||
|
if (!deleteUrl.isEmpty()) {
|
||||||
|
for (String url : deleteUrl) {
|
||||||
|
fs.delete(url);
|
||||||
|
}
|
||||||
|
deleteUrl = new HashSet<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue