Java - 可变数量的变量

时间:2015-11-25 15:15:05

标签: java

我编写了一个代码来查找PDF文件中的所有网址,并替换与从PHP脚本传递的参数相匹配的网址。

传递单个URL时工作正常。但我不知道如何处理多个URL,我猜我需要一个读取数组长度的循环,并调用changeURL方法传递正确的参数。

实际上,如果语句(如果myarray.lenght< 4执行此操作,如果它是< 6,那么,如果< 8 .....),我就可以使用它,但我猜这不是最佳方式。所以我删除了它并想尝试别的东西。

从PHP传递的参数(按此顺序):

  • args [0] - 原始PDF的位置
  • args [1] - 新PDF的位置
  • args [2] - 网址1(要更改的网址)
  • args [3] - 网址1a(将替换网址1的网址)
  • args [4] - 网址2(要更改的网址)
  • args [5] - 网址2a - (将取代网址2的网址)
  • ARGS ...

等等......最多可能大约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技能有限,却没有取得任何成功。

另外,如果您发现任何狡猾的代码,请告诉我,以便我可以从更有经验的程序员那里学习最佳实践。

3 个答案:

答案 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();
    }
}