I was trying to get the location using javascript and passed the coordinates to apply stamp on the stamp but it does not work properly. Below is the function I used to capture the coordinates of the mouse pointer.
function divMove(e){
var div = document.getElementById('stamp');
div.style.position = 'absolute';
//div.style.top = e.clientY + 'px';
//div.style.left = e.clientX + 'px';
var box = div.getBoundingClientRect();
mouse_top = e.clientY;
mouse_left = e.clientX;
var diff_x = mouse_left - box.left;
var diff_y = mouse_top - box.top;
div.style.top = ((Number(div.style.top.replace("px", "")) - 1) + diff_y) +"px";
div.style.left = ((Number(div.style.left.replace("px", "")) - 1) + diff_x) +"px";
document.getElementById("data").innerHTML =
"mouse_top:" + mouse_top + "<br>mouse_left:" + mouse_left
}
Below is the back-end code to handle the stamping part using iText:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Properties p = new Properties();
p.load(new FileInputStream("config.properties"));
String src = p.getProperty("src");
String dest = p.getProperty("dest");
String imgSrc = p.getProperty("stamp");
PdfDocument doc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));
ImageData image = ImageDataFactory.create(imgSrc);
float w = image.getWidth();
float h = image.getHeight();
System.out.println("w: " + w + ", h: " + h);
float mouseX = Float.valueOf(request.getParameter("mouseTop"));
float mouseY = Float.valueOf(request.getParameter("mouseLeft"));
System.out.println("top: " + mouseX + ", left: " + mouseY);
//Rectangle rect = new Rectangle(Math.abs(mouseX-600)+w,Math.abs(mouseY-300)+h,w,h);
Rectangle rect = new Rectangle(mouseX,mouseY,w,h);
PdfStampAnnotation stamp = new PdfStampAnnotation(rect).setStampName(new PdfName("Approved"));
PdfFormXObject xObj = new PdfFormXObject(new Rectangle(w,h));
PdfCanvas canvas = new PdfCanvas(xObj,doc);
canvas.addImage(image,0,0,false);
//canvas.getGraphicsState();
stamp.setNormalAppearance(xObj.getPdfObject());
stamp.setFlags(PdfAnnotation.PRINT);
stamp.setFlags(PdfAnnotation.LOCKED);
for(int i=1;i<=doc.getNumberOfPages();i++) {
doc.getPage(i).addAnnotation(stamp);
}
//doc.getFirstPage().addAnnotation(stamp);
FileOutputStream out = new FileOutputStream("config.properties");
p.setProperty("src", dest);
p.setProperty("dest", src);
p.store(out, null);
out.close();
doc.close();
//first read the file to byte array
try {
File file = new File(dest);
if(file.canRead()) {
String base64File;
//define the byte array to store the file
byte[] byteFile = new byte[(int)file.length()];
//define the stream to read the pdf
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(file);
//convert the read file's stream byte to base64
//important for streaming the pdf bytes back to the front
Base64OutputStream baos = new Base64OutputStream(bytes);
int len;
//read the byte from file then write it through stream to byteFile variable
//read is reading one by one
while((len = fis.read(byteFile)) > 0){
baos.write(byteFile,0,len);
}
baos.flush();
// turn the read byte into string
base64File = bytes.toString("UTF-8");
bytes.close();
baos.close();
fis.close();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition","inline");
response.setCharacterEncoding("UTF-8");
response.setContentLength(base64File.length());
//write the base64 string to the response message body
response.getWriter().write(base64File,0,base64File.length());
//response.getOutputStream().write(base64File,0,base64File.length());
} else {
response.setCharacterEncoding("UTF-8");
response.getWriter().write("File is unreadable!");
}
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}
This is the position I am going to stamp:
The output is not what I expected:
px
). Please read the FAQ to find out more about the measurement unit in PDF: developers.itextpdf.com/content/… – Etude