【发布时间】:2015-11-25 15:15:05
【问题描述】:
我编写了一个代码来查找 PDF 文件中的所有 URL,并替换与从 PHP 脚本传递的参数匹配的 URL。
通过单个 URL 时它工作正常。但我不知道如何处理多个 URL,我猜我需要一个循环来读取数组长度,并调用 changeURL 方法传递正确的参数。
我实际上使它与 if 语句一起工作 (如果 myarray.lenght ,但我是猜测这不是最佳方式。所以我把它删了,想试试别的。
从 PHP 传递的参数(按此顺序):
- args[0] - 原始 PDF 的位置
- args[1] - 新 PDF 的位置
- args[2] - URL 1(要更改的 URL)
- args[3] - URL 1a(将替换 URL 1 的 URL)
- args[4] - URL 2(要更改的 URL)
- args[5] - URL 2a -(将替换 URL 2 的 URL)
- 参数...
等等...最多可能有 16 个参数,具体取决于 PDF 文件包含多少个 URL。
代码如下:
Main.java
public class Main {
public static void main(String[] args) {
if (args.length >= 4) {
URLReplacer.changeURL(args);
} else {
System.out.println("PARAMETER MISSING FROM PHP");
}
}
}
URLReplacer.java
public class URLReplacer {
public static void changeURL(String... a) {
try (PDDocument doc = PDDocument.load(a[0])) {
List<?> allPages = doc.getDocumentCatalog().getAllPages();
for (int i = 0; i < allPages.size(); i++) {
PDPage page = (PDPage) allPages.get(i);
List annotations = page.getAnnotations();
for (int j = 0; j < annotations.size(); j++) {
PDAnnotation annot = (PDAnnotation) annotations.get(j);
if (annot instanceof PDAnnotationLink) {
PDAnnotationLink link = (PDAnnotationLink) annot;
PDAction action = link.getAction();
if (action instanceof PDActionURI) {
PDActionURI uri = (PDActionURI) action;
String oldURL = uri.getURI();
if (a[2].equals(oldURL)) {
//System.out.println("Page " + (i + 1) + ": Replacing " + oldURL + " with " + a[3]);
uri.setURI(a[3]);
}
}
}
}
}
doc.save(a[1]);
} catch (IOException | COSVisitorException e) {
e.printStackTrace();
}
}
}
我尝试了各种循环,但由于我有限的 Java 技能,没有取得任何成功。
另外,如果您发现任何不可靠的代码,请告诉我,以便我可以向更有经验的程序员学习最佳实践。
【问题讨论】:
-
你可以使用一个数组,并用 JSON 传输它。如果你有几十个参数很有用...
-
我没有使用 JSON 的经验,我只是一个初学者,但我会确保研究这种可能性。谢谢!
标签: java