大家好,才是真的好。
好久沒有寫專門開發(fā)方面的知識(shí),主要是因?yàn)榭吹娜颂?。嗯,?dāng)然,這是表面上的,實(shí)際上更重要的原因是,寫得很麻煩,而且看的人少。
開發(fā)要調(diào)試,代碼要反復(fù)測(cè)試,最后還要共享給大家,就說(shuō)難不難?不過,好處是,用功之后,可以多炫幾碗飯。
今天我們介紹的是將Notes應(yīng)用中的PDF附件轉(zhuǎn)為圖片文件。
有很多這樣的需求,例如現(xiàn)在外面消費(fèi),開的發(fā)票都是PDF格式,拿回到公司報(bào)銷,有可能需要轉(zhuǎn)換為圖片,并插入Word里面打印出來(lái);例如別人發(fā)個(gè)PDF文件過來(lái),讓你放在網(wǎng)站上顯示;例如別人沒有PDF查看器,又要看你發(fā)的PDF內(nèi)容……
不多說(shuō)了,讓我們開始正文吧。
該功能是采用兩個(gè)代理實(shí)現(xiàn),一個(gè)是LotusScript代理,主要將選中的Notes文件里面的PDF文件提取出來(lái);另一個(gè)是Java代理,將提取的PDF導(dǎo)出為圖片。
你也可以選擇別的方式,例如將Java寫成腳本庫(kù),然后通過LS2J方式調(diào)用,但考慮到大多數(shù)讀者開發(fā)知識(shí),采用了兩個(gè)代理。
首先來(lái)一段導(dǎo)出附件PDF的LotusScript,這個(gè)網(wǎng)上到處都有,可以隨便搜索找到,最簡(jiǎn)單的樣例如下圖:
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
有了這個(gè)基礎(chǔ),后面的就容易點(diǎn)。
PDF轉(zhuǎn)圖片要使用Java的pdfbox類庫(kù)包,這是專門為Java開發(fā)人員操作PDF文檔而準(zhǔn)備的純Java類庫(kù),下載地址是https://pdfbox.apache.org/download.html,如下圖:
最新版本為3.0,不過這個(gè)版本示例不多,資料也少,一般用2.0版本。
順便說(shuō)一下,雖然Java的開源類庫(kù)包很多,功能也很強(qiáng),但也有不少坑。
我先用的1.8.x版,可坑人了。好消息是,也坑過別人,就是會(huì)報(bào)字體引入錯(cuò)誤,如下:
特別搞笑的是,這場(chǎng)技術(shù)的討論,演變成了Notes/Domino產(chǎn)品是否還有人用的討論。
還是提問的哥們實(shí)誠(chéng)。說(shuō)自己已經(jīng)入行Notes/Domino產(chǎn)品19年了(如果算到2023年,也就是今年,應(yīng)該是23年了),他說(shuō)從他工作第一年開始,就有人跟他說(shuō)這個(gè)不行了,但他一直還在上面工作,估計(jì)還要工作20年才能等待退休。
好了,言歸正傳,開始我們的Java代理之旅,在你的Notes庫(kù)中,新建一個(gè)Java代理程序,叫什么名字不重要,重要的是代碼要選擇Java,如下圖:
然后導(dǎo)入pdfbox包,是三個(gè),如下圖:
然后是時(shí)候編寫一點(diǎn)點(diǎn)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();
}
}
}
上述代碼有點(diǎn)糙,但是能用,希望你也優(yōu)化一下。畢竟寫開發(fā)功能相關(guān)內(nèi)容,還是很辛苦的。里面的代碼session.SETENVIRONMENTVAR(“AgentPDFFileName”, “c:\reports\newfile” & CStr(fileCount))一行,就是將PDF附件的名字,寫入到notes.ini,供Java代理讀取。你也可以采用別的方式,例如簡(jiǎn)要表文檔、命名文檔(v12版本中支持)等。
最后你也可以看看效果,打開一個(gè)Notes文檔,點(diǎn)擊操作菜單,選擇Lotusscript代理運(yùn)行,如下圖:
附件一個(gè)或多個(gè)都可以,要是可以請(qǐng)自己嘗試一下吧。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-550635.html
今天的分享就寫到這里吧。更多文章可關(guān)注微信公號(hào):協(xié)作者文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-550635.html
到了這里,關(guān)于將Notes應(yīng)用中的PDF附件轉(zhuǎn)為圖片的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!