Java 循环整个代码 3 次

标签 java loops pdf exception

我编写了一些代码,使用从 PHP 作为参数传递的电子邮件和 IP 在 PDF 文件的所有页面上添加标记。我有几个问题。请参阅下文。

代码:

Main.java

public class Main {

public static void main(String[] args) throws IOException {
    Logger log = LoggerFactory.getLogger("User ID: " + args[0]);

    try {
        Helper.sortposition(args[0], args[1], args[2], args[3], args[4], args[5]);
    } catch (ArrayIndexOutOfBoundsException e) {
        String code = "PARAMETER MISSING FROM PHP";
        log.error(code);
    }
}
}

Helper.java

public class Helper {

public static void sortposition(String id, String email, String ip, String originalpdf, String newpdf, String report) throws IOException {

    Properties prop = new Properties();
    InputStream in = null;
    String hxStr, hyStr, fxStr, fyStr, fhStr, ffStr;
    Float hx, hy, fx, fy, fh, ff;
        /*  hx= Header "x" position
            hy= Header "y" position
            fx= Footer "x" position
            fy= Footer "y" position
            fh= Font size on the Header (Font Header)
            ff= Font size on the Footer (Font Footer) */

    String colour;

    in = Helper.class.getResourceAsStream("files/config.properties");
    prop.load(in);

    switch (report) {
        case "1":
            fhStr = prop.getProperty("fh1");
            ffStr = prop.getProperty("ff1");
            colour = prop.getProperty("type1rgb");
            hxStr = prop.getProperty("type1hx");
            hyStr = prop.getProperty("type1hy");
            fxStr = prop.getProperty("type1fx");
            fyStr = prop.getProperty("type1fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        case "2":
            fhStr = prop.getProperty("fh2");
            ffStr = prop.getProperty("ff2");
            colour = prop.getProperty("type2rgb");
            hxStr = prop.getProperty("type2hx");
            hyStr = prop.getProperty("type2hy");
            fxStr = prop.getProperty("type2fx");
            fyStr = prop.getProperty("type2fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        case "3":
            fhStr = prop.getProperty("fh3");
            ffStr = prop.getProperty("ff3");
            colour = prop.getProperty("type3rgb");
            hxStr = prop.getProperty("type3hx");
            hyStr = prop.getProperty("type3hy");
            fxStr = prop.getProperty("type3fx");
            fyStr = prop.getProperty("type3fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        case "4":
            fhStr = prop.getProperty("fh4");
            ffStr = prop.getProperty("ff4");
            colour = prop.getProperty("type4rgb");
            hxStr = prop.getProperty("type4hx");
            hyStr = prop.getProperty("type4hy");
            fxStr = prop.getProperty("type4fx");
            fyStr = prop.getProperty("type4fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
            break;
        default:
            fhStr = prop.getProperty("fh5");
            ffStr = prop.getProperty("ff5");
            colour = prop.getProperty("type5rgb");
            hxStr = prop.getProperty("type5hx");
            hyStr = prop.getProperty("type5hy");
            fxStr = prop.getProperty("type5fx");
            fyStr = prop.getProperty("type5fy");
            fh = Float.parseFloat(fhStr);
            ff = Float.parseFloat(ffStr);
            hx = Float.parseFloat(hxStr);
            hy = Float.parseFloat(hyStr);
            fx = Float.parseFloat(fxStr);
            fy = Float.parseFloat(fyStr);
    }

    String delims = "[,]+";
    String[] colourstr = colour.split(delims);
    int[] rgb = new int[colourstr.length];
    for (int i = 0; i < colourstr.length; ) {
        rgb[i] = Integer.parseInt(colourstr[i]);
        i++;
        Stamper.putStamp(id, email, ip, originalpdf, newpdf, rgb, hx, hy, fx, fy, fh, ff);
    }
}
}

Stamper.java

public class Stamper {

public static void putStamp(String id, String email, String ip, String originalpdf, String newpdf, int[] rgb, Float hx, Float hy, Float fx, Float fy, Float fh, Float ff) {
    Logger log = LoggerFactory.getLogger("User ID: " + id);

    PdfReader pdfReader;
    PdfStamper pdfStamper = null;
    Properties prop = new Properties();
    InputStream in = null;

    try {
        in = Stamper.class.getResourceAsStream("files/config.properties");
        prop.load(in);

        pdfReader = new PdfReader(originalpdf);
        pdfStamper = new PdfStamper(pdfReader,
                new FileOutputStream(newpdf));

        Font font = FontFactory.getFont("files/LTe50327.ttf",
                BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 0.8f, Font.BOLD);
        BaseFont bf = font.getBaseFont();

        int pages = pdfReader.getNumberOfPages();
        for (int i = 1; i <= pages; i++) {
            PdfContentByte pageContentByteHeader = pdfStamper.getOverContent(i);
            PdfContentByte pageContentByteFooter = pdfStamper.getOverContent(i);
            pageContentByteHeader.beginText();
            pageContentByteHeader.setFontAndSize(bf, fh);
            pageContentByteHeader.setRGBColorFill(rgb[0], rgb[1], rgb[2]);
            pageContentByteHeader.setTextMatrix(hx, hy);
            pageContentByteHeader.showText("This report has been prepared for " + email
                    + " " + ip + " Not to be redistributed without prior permission.");
            pageContentByteHeader.endText();

            pageContentByteFooter.beginText();
            pageContentByteFooter.setFontAndSize(bf, ff);
            pageContentByteFooter.setRGBColorFill(rgb[0], rgb[1], rgb[2]);
            pageContentByteFooter.setTextMatrix(fx, fy);
            pageContentByteFooter.showText("This report has been prepared for " + email
                    + " " + ip + " Not to be redistributed without prior permission.");
            pageContentByteFooter.endText();
        }

    } catch (IOException | DocumentException e) {
        String code = "Problem with opening or saving PDF file";
        log.error(code);
    } finally {
        try {
            if (pdfStamper != null) {
                pdfStamper.close();
            }
            if (in != null) {
                in.close();
            }
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }
}
}

它按预期工作,但看起来它循环了整个代码 3 次。

在调试它时,我注意到它第一次运行正常(Main -> Helper -> Stamper),但完成后,它返回到 Helper 类,然后再次进入 Stamper。然后它会在完成之前再次执行此操作。我确信这是我忽略的简单事情,但由于我仍然是 Java 的初学者,我不明白为什么会发生这种情况。这很烦人,因为当它捕获异常时,它会记录 3 次。

当我故意让它抛出异常来测试记录器时,它会输出以下内容:

17:22:12.541 [main] ERROR User ID: 10548 - Problem with opening or saving PDF file
17:22:12.596 [main] ERROR User ID: 10548 - Problem with opening or saving PDF file
17:22:12.635 [main] ERROR User ID: 10548 - Problem with opening or saving PDF file

Process finished with exit code 0

所以我的问题是:

1̶-̶ ̶W̶h̶y̶ ̶i̶s̶ ̶m̶y̶ ̶c̶o̶d̶e̶ ̶l̶o̶o̶p̶i̶n̶g̶ ̶3̶ ̶t̶i̶m̶e̶s̶ ̶b̶e̶t̶w̶e̶e ̶n̶ ̶H̶e̶l̶p̶e̶r̶ ̶a̶n̶d̶ ̶S̶t̶a̶m̶p̶e̶r̶ ̶c̶l̶a̶s̶s̶e̶s̶?̶ - 已修复

2- 在 Helper 类中,有没有办法使用 if 语句而不是 switch ?会有什么好处吗?我试过了,但没成功。

3-在Stamper类中,有没有一种方法可以捕获IOException,以便我知道问题是在打开PDF(originalpdf)时还是在保存(newpdf)时并相应地记录时?不要像现在这样,而是记录:“打开或保存 PDF 文件时出现问题”。

我将不胜感激任何意见。

最佳答案

for (int i = 0; i < colourstr.length; )

Helper 类中,您有一个将多次抛出异常的循环。与colours.str.length一样多,因为它调用

Stamper.putStamp(id, email, ip, originalpdf, newpdf, rgb, hx, hy, fx, fy, fh, ff);

每次循环。

<小时/>

解决方案的一个途径是准确检测该循环正在执行的操作。完成此操作后,问问自己是否需要调用同一方法三次。如果还是这样的话,这里就没有问题了。如果不是,您需要做出正确的更改。

关于Java 循环整个代码 3 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33441910/

相关文章:

linux - Ghostscript 无效字体错误

java - 始终在目标之前运行生命周期阶段(例如包)(例如 exec :exec)

java - foreach 循环内的 foreach 循环 (Java)

java - 使用 pdfbox 时 pdf 页面中的坐标

python - 为什么x的内容消失了。关于 python 中正确性的推理?

javascript - 嵌套的 JavaScript 循环如何自然中断

javascript - 将 base64 响应转换为 PDF

java - 创建 lambda 二维数组

java - JTable 中行选择的受控编辑

java - 如何阻止 Java 应用程序在数据库中插入相同的值 - SQL Server