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

news2024/9/28 1:14:40

大家好,才是真的好。

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

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

今天我们介绍的是将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代理运行,如下图:
在这里插入图片描述
附件一个或多个都可以,要是可以请自己尝试一下吧。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java入门--变量

变量是什么&#xff1f; 变量是用来记住程序要处理的数据的。 变量的定义格式&#xff1f; 数据类型 变量名 数据 注意&#xff1a;这里面的 是赋值的意思&#xff0c;把等号右边的赋值给左边 变量名命名规则&#xff1a; 以字母、下划线、$ 作为首字母由字母、数字、下…

map和set介绍及使用

目录 一、什么是关联式容器 二、set 1.set的介绍 2.set的使用方法 三、mutiset 四、map 1.map简介 2.map的使用 五、multimap 一、什么是关联式容器 在了解map、set之前&#xff0c;你肯定已经使用过vector、list、deque、forward_list(C11)等这些容器&#xff0c;而他…

Jtti:linux如何查看磁盘驱动器列表?

在Linux系统中&#xff0c;你可以使用以下命令之一来查看磁盘驱动器列表&#xff1a; 1.使用 fdisk 命令&#xff1a;运行以下命令来查看磁盘驱动器列表&#xff1a; 这会列出系统中所有的磁盘驱动器及其分区。 2.使用 lsblk 命令&#xff1a;运行以下命令来查看磁盘驱动器列表…

SpringSecurity学习总结

目录 一、简介 二、使用 引入 登录验证流程 完整流程 三、案例(登录验证) 三、设置密码加密和解密方式 三、自定义登录 四、定义JWT认证过滤器 简介 流程 JWT(当前未使用) 定义token过滤 配置过滤器为最前 再次总结流程 五、退出登录 六、一些中间配置 七、网关…

05-流式操作:使用 Flux 和 Mono 构建响应式数据流

1 通过 Flux 对象创建响应式流 基于各种工厂模式的静态创建方法编程的方式动态创建 Flux 相对而言&#xff0c;静态方法在使用上都比较简单&#xff0c;但不如动态方法来得灵活。我们来一起看一下。 2 通过静态方法创建 Flux Reactor 中静态创建 Flux 的方法常见的包括 jus…

机器学习、深度学习、人工智能三者之间究竟是什么关系?

1 什么是人工智能 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff1a;人工智能是一个广泛的概念&#xff0c;指的是使计算机系统具备像人类一样的智能和能力。人工智能涵盖了包括机器学习和深度学习在内的各种方法和技术&#xff0c;旨在让计算机能够感知、…

IPO观察丨黑芝麻智能递表港交所,车芯行业已迈向量产决战期?

虽然我国汽车芯片行业还处在发展初期&#xff0c;但已经迸发出无限潜力。 一方面&#xff0c;智能汽车的发展不断带动需求增长&#xff1b;另一方面&#xff0c;政策引导下&#xff0c;汽车芯片企业持续抢占高地。对此&#xff0c;在7月5日-7日举办的2023年中国汽车论坛上&…

【数据结构二叉树OJ系列】7、构建二叉树并中序遍历

目录 题述&#xff1a; 思路&#xff1a; 正确代码&#xff1a; 题述&#xff1a; 编写一程序&#xff0c;读入用户输出的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。例如如下的先序遍历字符串&#xff1a;ABC##DE#…

C++通过回车结束循环输入

试想一个案例&#xff0c;假设需要你输入n行数字&#xff0c;而每一行输入的数字数量都未知&#xff08;不定&#xff09;&#xff0c;如何通过C来实现这一操作&#xff1f; 本贴笔者给出一个具体案例&#xff1a;首先规定输入的行数&#xff0c;而后在每一行输入不定量的数字&…

Scratch 足球打蛤蟆

Scratch 足球打蛤蟆 本程序转换为HTML后运行。“足球”角色和角色“麦克斯”跟随鼠标&#xff0c;点击鼠标时“足球”角色复制并向鼠标方向开始移动&#xff0c;碰到边缘反弹&#xff0c;移动一定步数后删除。“蛤蟆”角色每0.5秒在随机位置和方向生成&#xff0c;碰到足球角色…

精彩回顾 | 模型与数据驱动工业数智化——Modelica暨装备数字化研讨会(2023)圆满召开

2023年6月30日&#xff0c;以“模型与数据驱动工业数智化”为主题的Modelica暨装备数字化研讨会&#xff08;2023&#xff09;在江苏省苏州市隆重召开。会议由苏州同元软控信息技术有限公司&#xff08;简称“同元软控”&#xff09;与哈尔滨工业大学计算学部等单位联合主办&am…

信息文档管理与配置管理

目录 ​编辑 一、软件文档的分类 1.1 开发文档 1.2 产品文档 1.3 管理文档 二、文档质量等级划分 2.1 1级文档 2.2 内部文档(2级) 2.3 工作文档&#xff08;3级&#xff09; 2.4 正式文档&#xff08;4级&#xff09; 三、配置管理 3.1 配置管理的定义 3.2 配置管理的6个主要…

F5是什么意思?聊聊你所不知道的F5

5月底&#xff0c;有幸参加了F5 Forum 科技趋势峰会&#xff0c;这让我不仅关注数字化企业和应用服务的技术趋势&#xff0c;也对华丽转型后的F5有了更深入的了解。如果你对F5是什么意思尚且存在疑问&#xff0c;那这篇文章我们就聊聊我眼中的F5&#xff0c;这个应用及API交付和…

编程(44)----------MySQL索引存储

MySQL的索引存储使用的并非像其展示出的那样以类似表格的方式. 而是以B数的方式存储. 在此之前先了解一下作为前身的B树 首先明确, 无论如何数据库中的存储方式都是树型. 而B树其实就是多叉树. 其结构大概如图所示. 假设根节点中存储了key1为5 33 这两个数据. 那其子节点就以这…

CYCLO(GLY-L-PHE),10125-07-2,环(甘氨酰-L-苯丙氨酰),具有生物活性的光学异构体

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ cyclo(Gly-Phe)&#xff0c;CYCLO(-GLY-PHE)&#xff0c;CYCLO(GLY-L-PHE)&#xff0c;Cyclo(-Gly-L-Phe)≥ 95% (HPLC) 环(甘氨酰-L-苯丙氨酰)Product structure&#xff1a; Product specifications&#xff1a; 1.CAS N…

软件测试工程师必备的SQL语句基础

文末有惊喜 为一个软件测试工程师&#xff0c;我们在测试过程中往往需要对数据库数据进行操作&#xff0c;但是我们的操作大多以查询居多&#xff0c;有时会涉及到新增&#xff0c;修改&#xff0c;删除等操作&#xff0c;所以我们其实并不需要对数据库的操作有特别深入的了解&…

vscode使用Eslint+Prettier格式化代码

1、安装Eslint插件和Prettier插件 2、 安装eslint npm install eslint -g1&#xff09;、初始化项目 npm init -y 2&#xff09;、生成eslint配置文件 npx eslint --init 完之后生成一个.eslintrc.json的文件 二、vscode配置 1、vscode需要配置保存自动化格式 设置 ->…

QWebEngine应用---基于QWebChannel实现网页与qt层交互

Qt提供了QWebChannel实现和网页的通信&#xff0c;我们直接拿github上一个能直接运行的demo来做说明&#xff0c;demo是基于Widget&#xff0c;且页面是自己实现的页面&#xff0c;接着会介绍基于QML实现且页面是第三方网站如何使用的。 QWebChannel用法 我们先看看demo的运行…

RocketMQ5.0消息消费<二> _ 消息队列负载均衡机制

RocketMQ5.0消息消费&#xff1c;二&#xff1e; _ 消息队列负载均衡机制 一、消费队列负载均衡概览 RocketMQ默认一个主题下有4个消费队列&#xff0c;集群模式下同一消费组内要求每个消费队列在同一时刻只能被一个消费者消费。那么集群模式下多个消费者是如何负载主题的多个…

第四十四章Java访问对象的属性和行为以及销毁

Java访问对象的属性和行为 每个对象都有自己的属性和行为&#xff0c;这些属性和行为在类中体现为成员变量和成员方法&#xff0c;其中成员变量对应对象的属性&#xff0c;成员方法对应对象的行为。 在Java中&#xff0c;要引用对象的属性和行为&#xff0c;需要使用点…