我编写了一个代码来查找PDF文件中的所有网址,并替换与从PHP脚本传递的参数相匹配的网址。
传递单个URL时工作正常。但我不知道如何处理多个URL,我猜我需要一个读取数组长度的循环,并调用changeURL方法传递正确的参数。
实际上,如果语句(如果myarray.lenght< 4执行此操作,如果它是< 6,那么,如果< 8 .....),我就可以使用它,但我猜这不是最佳方式。所以我删除了它并想尝试别的东西。
从PHP传递的参数(按此顺序):
等等......最多可能大约16个args,具体取决于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技能有限,却没有取得任何成功。
另外,如果您发现任何狡猾的代码,请告诉我,以便我可以从更有经验的程序员那里学习最佳实践。
答案 0 :(得分:1)
你的主要问题 - 据我所知 - 是“可变数量的变量”。你必须从PHP发送到JAVA。
1您可以逐个传输
2或者,在一个结构中。 有几种结构。 JSON在PHP上相当简单:这里有多个例子: encode json using php?
对于java,你有:Decoding JSON String in Java。
或其他(如XML,对此来说似乎过于复杂)。
答案 1 :(得分:0)
我将您的方法结构化为接受特定参数。我使用map来接受URL,自定义对象将是另一种选择。
还要注意循环的更改方式,可能会给你一些Java技能的提示。
public static void changeURL(String originalPdf, String targetPdf, Map<String, String> urls ) {
try (PDDocument doc = PDDocument.load(originalPdf)) {
List<PDPage> allPages = doc.getDocumentCatalog().getAllPages();
for(PDPage page: allPages){
List annotations = page.getAnnotations();
for(PDAnnotation annot : page.getAnnotations()){
if (annot instanceof PDAnnotationLink) {
PDAnnotationLink link = (PDAnnotationLink) annot;
PDAction action = link.getAction();
if (action instanceof PDActionURI) {
PDActionURI uri = (PDActionURI) action;
String oldURL = uri.getURI();
for (Map.Entry<String, String> url : urls.entrySet()){
if (url.getKey().equals(oldURL)) {
uri.setURI(url.getValue());
}
}
}
}
}
}
doc.save(targetPdf);
} catch (IOException | COSVisitorException e) {
e.printStackTrace();
}
}
如果必须从命令行获取URL和PDF位置,请调用changeURL函数,如下所示:
public static void main(String[] args) {
if (args.length >= 4) {
String originalPdf = args[0];
String targetPdf = args[1];
Map<String, String> urls = new HashMap<String, String>();
for(int i = 2; i< args.length; i+=2){
urls.put(args[i], args[i+1]);
}
URLReplacer.changeURL(originalPdf, targetPdf, urls);
} else {
System.out.println("PARAMETER MISSING FROM PHP");
}
}
答案 2 :(得分:-1)
在我的头脑中,你可以做这样的事情
public function getAllValuesFromOneTable($table1, $fromDate, $toDate) {
try {
$statement = $this->prepareStatement("SELECT * FROM $table1 WHERE date_of_post >= '$fromDate' AND date_of_post <= '$toDate'");
$statement->execute();
$test = $statement->fetchAll(PDO::FETCH_ASSOC);
return $test;
} catch (Exception $e) {
echo "error: " . $e->getMessage();
}
}