【问题标题】:Plot coordinates on PDF displayed in iFrame在 iFrame 中显示的 PDF 上绘制坐标
【发布时间】:2013-03-16 07:34:54
【问题描述】:

首先,我感谢我的请求相当“雄心勃勃”,但非常感谢任何帮助,因为我不确定最好的方法。

在用户上传 PDF 后,在我的网站(使用 PHP/MySQL 构建)上,我想在页面上显示 PDF 内联(我假设在 iFrame 中)。然后我需要他们能够在 PDF 顶部拖出一些“框”(我假设使用 jQuery)。然后我需要记录这个框的坐标,以便稍后我可以重新创建 PDF,将新文本注入到定义的“框”中。

这听起来可行吗?如果不是,你还有什么建议? (请不要说 imagemagick!)

我知道如何重新创建注入新文本的 PDF,但我的问题是如何允许用户记录这些坐标。

【问题讨论】:

    标签: php javascript jquery pdf


    【解决方案1】:

    您可以使用PDF.js 在页面上呈现 PDF。 PDF.js 会将其显示为页面的一部分,因此您可以附加事件并以您无法通过 Acrobat 插件显示的方式与之交互。

    我找不到用于获取坐标的预先存在的库,因此我编写了这段代码来实现它。

    Live demo of selection code

    $(function () {
        "use strict";
        var startX,
            startY,
            selectedBoxes = [],
            $selectionMarquee = $('#selectionMarquee'),
            positionBox = function ($box, coordinates) {
                $box.css(
                    'top', coordinates.top
                ).css(
                    'left', coordinates.left
                ).css(
                    'height', coordinates.bottom - coordinates.top
                ).css(
                    'width', coordinates.right - coordinates.left
                );
            },
            compareNumbers = function (a, b) {
                return a - b;
            },
            getBoxCoordinates = function (startX, startY, endX, endY) {
                var x = [startX, endX].sort(compareNumbers),
                    y = [startY, endY].sort(compareNumbers);
    
                return {
                    top: y[0],
                    left: x[0],
                    right: x[1],
                    bottom: y[1]
                };
            },
            trackMouse = function (event) {
                var position = getBoxCoordinates(startX, startY,
                    event.pageX, event.pageY);
                positionBox($selectionMarquee, position);
            };
    
    
        $(document).on('mousedown', function (event) {
            startX = event.pageX;
            startY = event.pageY;
            positionBox($selectionMarquee,
                getBoxCoordinates(startX, startY, startX, startY));
            $selectionMarquee.show();
            $(this).on('mousemove', trackMouse);
        }).on('mouseup', function (event) {
            var position,
                $selectedBox;
    
                $selectionMarquee.hide();
    
                position = getBoxCoordinates(startX, startY,
                    event.pageX, event.pageY);
    
                if (position.left !== position.right &&
                position.top !== position.bottom) {
                    $selectedBox = $('<div class="selected-box"></div>');
                    $selectedBox.hide();
                    $('body').append($selectedBox);
    
                    positionBox($selectedBox, position);
    
                    $selectedBox.show();
    
                    selectedBoxes.push(position);
    
                    $(this).off('mousemove', trackMouse);
                }
        });
    });
    

    一旦显示 PDF,您将不得不对其进行调整以获得相对于 PDF 的坐标,但这应该会让您走上正确的轨道。

    【讨论】:

    • 非常感谢您的回答和示例,这超出了我的期望/希望!明天有时间(希望如此)我会试一试,让您知道我的进展情况。
    • 我在实现此代码并针对显示 PDF 而不是整个文档的画布时发现导致“mouseup”事件失败。如果我在拖动时取出代码来绘制框,但显然我更愿意将其保留在适当的位置。我将自己继续测试,但我已经上传了一个示例,以防您知道可能导致此@UselessCode 的原因。 tarakan.chapmanio.co.uk/pdf/pdf.html
    • @chapmanio:您是否设法使用该代码实现了解决方案?我面临着完全相同的问题。
    • @chapmanio - 这个线程上的另一个问题,看看你是否找到了解决方案。我正朝着同样的道路前进,并愿意分享你的胜利:)
    • 如何将这些坐标映射到实际的 PDF?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2012-03-31
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多