将Notes应用中的PDF附件转为图片

大家好,才是真的好。

好久没有写专门开发方面的知识,主要是因为看的人太少。嗯,当然,这是表面上的,实际上更重要的原因是,写得很麻烦,而且看的人少。

开发要调试,代码要反复测试,最后还要共享给大家,就说难不难?不过,好处是,用功之后,可以多炫几碗饭。

今天我们介绍的是将Notes应用中的PDF附件转为图片文件。

有很多这样的需求,例如现在外面消费,开的发票都是PDF格式,拿回到公司报销,有可能需要转换为图片,并插入Word里面打印出来;例如别人发个PDF文件过来,让你放在网站上显示;例如别人没有PDF查看器,又要看你发的PDF内容……

不多说了,让我们开始正文吧。

该功能是采用两个代理实现,一个是LotusScript代理,主要将选中的Notes文件里面的PDF文件提取出来;另一个是Java代理,将提取的PDF导出为图片。

你也可以选择别的方式,例如将Java写成脚本库,然后通过LS2J方式调用,但考虑到大多数读者开发知识,采用了两个代理。

首先来一段导出附件PDF的LotusScript,这个网上到处都有,可以随便搜索找到,最简单的样例如下图:

Dim doc As NotesDocument
Dim rtitem As Variant
Dim fileCount As Integer
Const MAX = 100000
fileCount = 0    
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
  Forall o In rtitem.EmbeddedObjects
    If ( o.Type = EMBED_ATTACHMENT ) _
    And ( o.FileSize > MAX ) Then
      fileCount = fileCount + 1
      Call o.ExtractFile ( "c:\reports\newfile" & Cstr(fileCount) )
    End If
  End Forall
End If

有了这个基础,后面的就容易点。

PDF转图片要使用Java的pdfbox类库包,这是专门为Java开发人员操作PDF文档而准备的纯Java类库,下载地址是https://pdfbox.apache.org/download.html,如下图:
将Notes应用中的PDF附件转为图片_第1张图片
最新版本为3.0,不过这个版本示例不多,资料也少,一般用2.0版本。

顺便说一下,虽然Java的开源类库包很多,功能也很强,但也有不少坑。

我先用的1.8.x版,可坑人了。好消息是,也坑过别人,就是会报字体引入错误,如下:
将Notes应用中的PDF附件转为图片_第2张图片
特别搞笑的是,这场技术的讨论,演变成了Notes/Domino产品是否还有人用的讨论。

还是提问的哥们实诚。说自己已经入行Notes/Domino产品19年了(如果算到2023年,也就是今年,应该是23年了),他说从他工作第一年开始,就有人跟他说这个不行了,但他一直还在上面工作,估计还要工作20年才能等待退休。

好了,言归正传,开始我们的Java代理之旅,在你的Notes库中,新建一个Java代理程序,叫什么名字不重要,重要的是代码要选择Java,如下图:
将Notes应用中的PDF附件转为图片_第3张图片
然后导入pdfbox包,是三个,如下图:
将Notes应用中的PDF附件转为图片_第4张图片
将Notes应用中的PDF附件转为图片_第5张图片
然后是时候编写一点点Java代码了,代码我都分享给大家:

import lotus.domino.*;

import java.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;

import org.apache.pdfbox.rendering.PDFRenderer;


public class JavaAgent extends AgentBase {



    public void NotesMain() {



      try {

          Session session = getSession();

          AgentContext agentContext = session.getAgentContext();      

          

          String pdffilename=session.getEnvironmentString("AgentPDFFileName");

          String destinationDir = "D:\\pngdatatest\\";



          File sourceFile = new File(pdffilename);

			File destinationFile = new File(destinationDir);



			if (!destinationFile.exists()) {

				destinationFile.mkdir();

				System.out.println("Folder Created -> " + destinationFile.getAbsolutePath());

			}



			if (sourceFile.exists()) {

				PDDocument document = PDDocument.load(sourceFile);

				PDFRenderer pdfRenderer = new PDFRenderer(document);

				String fileName = sourceFile.getName().replace(".pdf", "");



				for (int pageNumber = 0; pageNumber < document.getNumberOfPages(); ++pageNumber) {

					BufferedImage bim = pdfRenderer.renderImageWithDPI(pageNumber, 300);

					String destDir = destinationDir + fileName + "_" + pageNumber + ".png";

					ImageIO.write(bim, "png", new File(destDir));

				}



				document.close();

				System.out.println("Image saved at -> " + destinationFile.getAbsolutePath());

			} else {

				System.err.println(sourceFile.getName() + " File does not exist");



			 } 

      } catch(Exception e) {

          e.printStackTrace();

       }

   }

}

上述代码有点糙,但是能用,希望你也优化一下。毕竟写开发功能相关内容,还是很辛苦的。里面的代码session.SETENVIRONMENTVAR(“AgentPDFFileName”, “c:\reports\newfile” & CStr(fileCount))一行,就是将PDF附件的名字,写入到notes.ini,供Java代理读取。你也可以采用别的方式,例如简要表文档、命名文档(v12版本中支持)等。

最后你也可以看看效果,打开一个Notes文档,点击操作菜单,选择Lotusscript代理运行,如下图:
将Notes应用中的PDF附件转为图片_第6张图片
附件一个或多个都可以,要是可以请自己尝试一下吧。

今天的分享就写到这里吧。更多文章可关注微信公号:协作者

你可能感兴趣的:(pdf,Notes,LotusScript代理,Java)