我编写了一些代码,使用从 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/