如何实现多个pd文件合并成单个pdf并下载原创
金蝶云社区-陈来珍
陈来珍
0人赞赏了该文章 644次浏览 未经作者许可,禁止转载编辑于2023年12月08日 15:57:13

关键词:pdf、合并、附件字段

一、需求

采购申请单上的分录上有一个附件字段,如何实现分录里的各行的pdf附件合并成单个pdf附件,并下载的浏览器的下载地址下。

image.png二、思路与方案

1、在临时文件夹下创建一个空的pdf文件,并遍历所有pdf文件的每一页,添加到新的pdf文件中。

2、把新的pdf文件夹上传到临时文件服务器,然后调用

this.getView().openUrl(url)

下载生成的pdf文件

三、实现过程

package demo.reqord.bill;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BadPdfFormatException;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfReader;
import kd.bos.bill.AbstractBillPlugIn;
import kd.bos.cache.CacheFactory;
import kd.bos.cache.TempFileCache;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.exception.KDException;
import kd.bos.fileservice.FileItem;
import kd.bos.fileservice.FileService;
import kd.bos.fileservice.FileServiceFactory;
import kd.bos.form.control.events.ItemClickEvent;
import kd.sdk.plugin.Plugin;
import oadd.com.google.common.io.Files;

import java.io.*;
import java.net.URLDecoder;
import java.util.EventObject;

/**
 * 单据界面插件
 */
public class PdfmergeBillPlugin extends AbstractBillPlugIn implements Plugin {
    @Override
    public void registerListener(EventObject e) {

        super.registerListener(e);
    }

    @Override
    public void itemClick(ItemClickEvent evt) {
        if (evt.getItemKey().equals("sunp_pdfmerge")) {
            //创建新的pdf文件作为合并的pdf文件
            Document document = new Document();
            PdfCopy pdfCopy=null;
            File tmp=null;
            try {
                //在临时文件夹上新建一个新的pdf文件
                 tmp= File.createTempFile("tmp", "merged.pdf");
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                 pdfCopy = new PdfCopy(document, new FileOutputStream(tmp.getAbsoluteFile()));
                document.open();
            } catch (DocumentException e) {
                throw new RuntimeException(e);
            } catch (FileNotFoundException e) {
                throw new RuntimeException(e);
            }
            //遍历单据体的附件字段的附件
            int count = this.getModel().getEntryRowCount("entryentity");
            for (int index = 0; index < count; index++) {
                DynamicObjectCollection atts =
                 (DynamicObjectCollection) this.getModel().getValue("sunp_attachmentfield",index);
                if (atts!=null){
                    DynamicObject att = (DynamicObject) atts.get(0).get("fbasedataid");
                    String url = att.getString("url");
                    String path=null;
                    if (url.contains("path=")){
                        String[] paths = url.split("path=");
                        path=paths[1];
                    }else {
                        path=url;
                    }
                    try {
                    //url解码
                        path = URLDecoder.decode(path, "UTF-8");
                    } catch (UnsupportedEncodingException e) {
                        throw new RuntimeException(e);
                    }
                    //移除前面多余的//
                    if (path.startsWith("//")){
                        path = path.substring(2, path.length());
                    }
                    PdfReader pdfReader=null;
                    try {
                         InputStream inputStream = FileServiceFactory.getAttachmentFileService().getInputStream(path);
//让文件服务器直接读出流,不要在PdfReader中直接传url,让系统去访问文件服务器
pdfReader = new PdfReader(inputStream);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                    //循环原pdf文件的各页信息,添加到新的pdf文件中
                    for (int i=1;i<=pdfReader.getNumberOfPages();i++){
                        try {
                            pdfCopy.addPage(pdfCopy.getImportedPage(pdfReader,i));
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        } catch (BadPdfFormatException e) {
                            throw new RuntimeException(e);
                        }
                        pdfReader.close();
                    }
                }
            }
            document.close();
            //先关闭document文件,再重新都文件流,并下载,否则读不到文件
            downPdfFile(tmp);
            }

        super.itemClick(evt);
    }

    //把临时文件上传的临时文件服务器,调用接口下载到浏览器下载路径下
    private void downPdfFile(File file) {
        // 上传为临时文件,主要作为this.getView().download提供下载地址C:\Users\kingdee\AppData\Local\Temp
//        String path = file.getAbsolutePath();
//        File file1 = new File(path);
        TempFileCache cache = CacheFactory.getCommonCacheFactory().getTempFileCache();
        String url = null;
        try {
            url = cache.saveAsUrl(file.getName(), new FileInputStream(file), 10 * 60);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        this.getView().openUrl(url);
    }
    }

四、效果图

点击pdf合并,把分录中附件字段中的两个附件,进行内容上合并成一个pdf文件,然后下载下来

image.png

image.png

五、开发环境版本

V5.0.011

六、参考资料

https://vip.kingdee.com/questions/512995051748806656/answers/513002400135860224?productLineId=29

https://vip.kingdee.com/article/266996196957528832?productLineId=29

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