Я делаю веб-приложение, используя Javascript для внешнего интерфейса, и вот как это работает:
Я запускаю приложение, и оно открывает веб-страницу через мой браузер.
Отображает страницу PDF, полученную из моего каталога.
У меня есть возможность нажать на штамп, перетащить и переместить PDF-файл и разместитькуда я захочу.
Когда я закончу, я могу нажать Сохранить, и он автоматически сохранит файл PDF в моем каталоге.
Я могу открыть файл PDF в своей папке, чтобы просмотреть обновленный PDF вместе с добавленной отметкой.
Проблема заключается в том, что при открытии файла PDF для просмотра расположение не идентичнопозиционирование штампа в веб-браузере.
Вот пример ввода (в веб-браузере):
А вот пример вывода в Adobe Reader (это не то, что я хочу):
Я знаю, что это в основном потому, что PDF измеряется с использованием пользовательских единиц по сравнению с пикселями в изображении.Должно быть что-то, что я мог бы изменить в Прямоугольник , чтобы оно соответствовало позиции веб-страницы.Что было бы лучшим способом найти правильное преобразование, чтобы позиция соответствовала тому, где я сохраняю штамп?
Javascript:
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
}
function save(){
$.ajax({
type: "GET",
url: "Save",
data: {
mouseTop : mouse_top,
mouseLeft : mouse_left
},
dataType: "text",
success: function (response) {
//use response to set stamp
if (response != null) {
var pdfAsArray = convertDataURIToBinary("data:application/pdf;base64, " + response);
loadPDFToViewer(pdfAsArray);
//document.getElementById("page-1").getElementsByClassName("pdfCanvas")[0].removeEventListener("click", addStamp);
} else {
alert("Response is null");
}
}
});
}
Java (бэкэнд):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//String src = "C:\\Apache Tomcat\\apache-tomcat-7.0.78\\myWork\\prototype\\haito.pdf";
//String dest = "C:\\Apache Tomcat\\apache-tomcat-7.0.78\\myWork\\prototype\\test.pdf";
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);
// adjusted mouse X and mouse Y position
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();
....................
}