【问题标题】:Java - Variable number of variablesJava - 可变数量的变量
【发布时间】: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


【解决方案1】:

据我所知,您的主要问题是“变量数量可变”。你必须从 PHP 发送到 JAVA。

1 你可以一一传送作为你的例子

2 或者,在一个结构中。 有几种结构。 JSON 在 PHP 中相当简单:这里有多个示例: encode json using php?

对于 java,你有:Decoding JSON String in Java

或其他(如 XML ,这似乎太复杂了)。

【讨论】:

    【解决方案2】:

    我会构建您的方法以接受特定参数。我使用地图来接受 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");
            }
        }
    

    【讨论】:

    • 一个问题,我注意到你已经改变了循环,有什么区别: for(PDPage page: allPages){} 和 for (int i = 0; i
    【解决方案3】:

    在我的脑海中,你可以做这样的事情

    public static void main(String[] args) {
    
        if (args.length >= 4 && args.length % 2 == 0) {
            for(int i = 2; i < args.length; i += 2) {
                URLReplacer.changeURL(args[0], args[1], args[i], args[i+1]);
                args[0] = args[1];
            }
        } else {
            System.out.println("PARAMETER MISSING FROM PHP");
        }
    }
    

    【讨论】:

    • 效率低下,这使得changeURL多次处理PDF文档。
    • @Aragorn 在我看来,他处理这个过程的整个方式是错误的,我只是提供了一个尊重他的界面的解决方案。我不相信我的回答值得你投反对票。
    • @GiorgosKritsotakis,虽然我认为您的答案不值得投反对票,但我发现 Aragorn 的示例(已接受的答案)更高效、更优雅。但感谢您的回答,因为它也有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2015-07-06
    • 2017-07-12
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多