我编写了一些代码,在PDF文件的所有页面上加上从PHP作为参数传递的电子邮件和IP。我有几个问题。请看下面的内容。
代码:
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次。
在调试它时,我注意到它第一次正常运行(主-> Helper ->邮票),但是当它完成后,它会返回到Helper类,然后再继续到->。然后在完成之前再做一次。我确信我忽略了一些简单的东西,但由于我仍然是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̶o̶d̶e̶̶l̶o̶p̶i̶n̶g̶3
在Helper类中,是否有一种使用if语句而不是开关的方法?它会有什么好处吗?我试过了,但一直没成功。
3-在邮票类中,是否有一种方法可以捕获IOException,使我知道问题是在打开PDF (原件PDF)还是保存(newpdf)并相应地登录时?而不是现在的方式,日志记录:“打开或保存PDF文件的问题”。
如有任何意见,我将不胜感激。
发布于 2015-10-30 17:46:35
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);每次它都会循环。
解决方案的一个途径就是准确地检测这个循环正在做什么。一旦你这样做了,问问自己是否需要调用三次相同的方法。如果仍然是这样的话,这里没有问题。如果不是,那就由你来做正确的改变。
https://stackoverflow.com/questions/33441910
复制相似问题