大家好,才是真的好。
好久没有写专门开发方面的知识,主要是因为看的人太少。嗯,当然,这是表面上的,实际上更重要的原因是,写得很麻烦,而且看的人少。
开发要调试,代码要反复测试,最后还要共享给大家,就说难不难?不过,好处是,用功之后,可以多炫几碗饭。
今天我们介绍的是将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,如下图:
最新版本为3.0,不过这个版本示例不多,资料也少,一般用2.0版本。
顺便说一下,虽然Java的开源类库包很多,功能也很强,但也有不少坑。
我先用的1.8.x版,可坑人了。好消息是,也坑过别人,就是会报字体引入错误,如下:
特别搞笑的是,这场技术的讨论,演变成了Notes/Domino产品是否还有人用的讨论。
还是提问的哥们实诚。说自己已经入行Notes/Domino产品19年了(如果算到2023年,也就是今年,应该是23年了),他说从他工作第一年开始,就有人跟他说这个不行了,但他一直还在上面工作,估计还要工作20年才能等待退休。
好了,言归正传,开始我们的Java代理之旅,在你的Notes库中,新建一个Java代理程序,叫什么名字不重要,重要的是代码要选择Java,如下图:
然后导入pdfbox包,是三个,如下图:
然后是时候编写一点点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代理运行,如下图:
附件一个或多个都可以,要是可以请自己尝试一下吧。
今天的分享就写到这里吧。更多文章可关注微信公号:协作者