我正在努力从一系列PDF中删除Protected View,并尝试在VBA中使用iText库。我在这一点上的主要问题是我不知道使用什么方法,并且iText文档非常密集。
我也很想从VBA调用iText库,所以对语法的任何帮助也很感激,但我确信如果我知道调用哪种方法,我可以自己到达那里。
目前,我有:
Dim program As WshExec
program = Shell("Java.exe -jar " & mypath & "\itext-5.5.6\itextpdf-5.5.6.jar")
'Debug.print program returns a value here, so this line works.
'I'm thinking I need something like:
'Set program = RunProgram("Java.exe -jar " & mypath & "\itext-5.5.6\itextpdf-5.5.6.jar", & _
methodName, param1)
我一直在使用以下问题让我这么做......
Calling Java library (JAR) from VBA/VBScript/Visual Basic Classic
Microsoft Excel Macro to run Java program
所需的功能是将不受保护的PDF放在mypath
的文件夹中。
答案 0 :(得分:3)
您尝试运行的jar不是可执行jar。 iText是一个通过将itextpdf-5.5.6.jar
添加到CLASSPATH而在Java应用程序中使用的库。如果你不编写任何Java代码,那么jar就不会做任何事情,因此你的Shell()
和你的RunProgram()
方法都没用:没有什么可以执行的。
此外:从你的问题来看,你的机器上有一个Java环境还远未确定。您正在VBA环境中工作,这让人想知道您为什么要使用Java版本的iText。您是否尝试过使用iTextSharp,这是iText的.NET版本(用C#编写)?
看一下本教程:Programmatically Complete PDF Form Fields using Visual Basic and the iTextSharp DLL
在本教程中,我们采用现有的PDF,填写表格,然后根据原始PDF获得另一个PDF,但需要额外的数据。您可以轻松调整代码,使其获取现有PDF,不会向PDF添加任何内容,但保存原始PDF而不使用其密码,如我对How can I decrypt a PDF document with the owner password?的回答中所述
如果您将从Java代码中学到的东西结合起来:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader.unethicalreading = true;
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();
}
根据您从表单填写教程中学到的内容,您可以得到类似的内容(前提是您使用iTextSharp DLL而不是iText jar):
Dim pdfTemplate As String = "c:\Temp\PDF\encrypted.pdf"
Dim newFile As String = "c:\Temp\PDF\decrypted.pdf"
PdfReader.unethicalreading = true
Dim pdfReader As New PdfReader(pdfTemplate)
Dim pdfStamper As New PdfStamper(pdfReader, New FileStream(
newFile, FileMode.Create))
pdfStamper.Close()
pdfReader.Close()
重要事项:如果文件仅受所有者密码保护(这是我在谈论受保护的视图时所假设的),则只会删除密码。如果文件受到任何其他方式的保护,您必须澄清。另请注意,参数 unethicalreading 并非没有意义:请确保您不会因删除保护而做出不道德行为。
答案 1 :(得分:0)
我不得不使用iText操纵受保护的PDF文件。 我只是在我的pom.xml中添加了以下依赖项,仅此而已。
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.59</version>
</dependency>