如何实现多个pd文件合并成单个pdf并下载原创
687次浏览
编辑于2023年12月08日 15:57:13
关键词:pdf、合并、附件字段
一、需求
采购申请单上的分录上有一个附件字段,如何实现分录里的各行的pdf附件合并成单个pdf附件,并下载的浏览器的下载地址下。
二、思路与方案
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文件,然后下载下来
五、开发环境版本
V5.0.011
六、参考资料
https://vip.kingdee.com/questions/512995051748806656/answers/513002400135860224?productLineId=29
https://vip.kingdee.com/article/266996196957528832?productLineId=29
pdfmergedemo.zip(9.53KB)
赞 0
0人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读