跟踪光标位置,并使用iTextSharp将光标位置的图像添加到PDF中

时间:2011-11-26 22:44:42

标签: c# winforms itextsharp

我正在寻找一种最合适的方式,允许用户将图像导入PDF并允许他们在PDF / winform周围拖动图片并指定图像的放置位置。

我认为最好的方法就是从cusor拉出位置。

类似的东西:

Rectangle rect = new Rectangle(400, 772, 545, 792);

输出是用户选择的光标位置,而不是预定义的坐标。

非常感谢任何帮助。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

用户可能很难通过在表单上按鼠标光标来选择图像位置。相反,我建议允许他们在网格周围拖动一个相对大小的矩形。您必须适当地转换坐标,包括修复Y值,因为iTextSharp从左下角而不是左上角开始,但这不应该太难。

下面是一个完整的C#2010 WinForms应用程序,它允许您在黑色方块周围拖动一个红色矩形。代码中的注释几乎可以解释所有内容。它有一个需要解决的大问题,它存储X / Y坐标是基于屏幕的而不是基于形式的,所以如果你拖动一次,移动整个表格并再次拖动就会变得“时髦”。这可以通过计算相对于表格的x / y来解决,而不是我留给你。

希望这会让你走上适合你的道路!

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        //Basic dimensions of our "border" and our "image". Assumes 72 dots per inch which isn't technically correct but gives us something to work with
        private int BORDER_WIDTH = (int)11 * 72;
        private int BORDER_HEIGHT = (int)8.5 * 72;
        private int IMAGE_WIDTH = (int)2 * 72;
        private int IMAGE_HEIGHT = (int)3 * 72;
        private int IMAGE_OFFSET = 5;

        //These will store the x/y when we press our mouse down so that we can calculate the drag later
        private int offsetX;
        private int offsetY;

        //Our main "image" that we'll move around
        PictureBox pb;
        //The "border" to move the image around in
        PictureBox border;

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //Resize the form and make it not user-resizable
            this.Size = new Size(BORDER_WIDTH + 30, BORDER_HEIGHT + 50);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;

            //Create our "image"
            pb = new PictureBox();
            pb.Size = new Size(IMAGE_WIDTH, IMAGE_HEIGHT);
            pb.Location = new Point(IMAGE_OFFSET, IMAGE_OFFSET);
            pb.BackColor = Color.Red;
            //Bind a handler to the mouse down event
            pb.MouseDown += new MouseEventHandler(this.pbMouseDown);
            this.Controls.Add(pb);

            //Create our "border"
            border = new PictureBox();
            border.Size = new Size(BORDER_WIDTH, BORDER_HEIGHT);
            border.Location = new Point(IMAGE_OFFSET, IMAGE_OFFSET);
            border.BackColor = Color.Black;
            this.Controls.Add(border);
        }
        private void pbMouseDown(object sender, MouseEventArgs e)
        {
            //Store the current x/y so that we can use them in calculations later
            offsetX = e.X;
            offsetY = e.Y;
            //When the mouse is down we want to remove the original mouse down handler
            pb.MouseDown -= new MouseEventHandler(this.pbMouseDown);
            //Add to more handler looking for mouse up and mouse movement
            pb.MouseUp += new MouseEventHandler(this.pbMouseUp);
            pb.MouseMove += new MouseEventHandler(this.pbMouseMove);
        }
        private void pbMouseUp(object sender, MouseEventArgs e)
        {
            //When the mouse button is released, remove old handlers and add back the down event
            pb.MouseMove -= new MouseEventHandler(this.pbMouseMove);
            pb.MouseUp -= new MouseEventHandler(this.pbMouseUp);
            pb.MouseDown += new MouseEventHandler(this.pbMouseDown);
            //Pop up a message, this is where something with iTextSharp would be done
            MessageBox.Show(String.Format("The top left of the image is at {0}x{1}", pb.Top - IMAGE_OFFSET, pb.Left - IMAGE_OFFSET));
        }
        private void pbMouseMove(object sender, MouseEventArgs e)
        {
            //Calculate where to draw the "image" at next
            //First, calculate based on the current image's location, the offset that we stored ealier and the current mouse position
            int newLeft = e.X + pb.Left - offsetX;
            int newTop = e.Y + pb.Top - offsetY;
            //Next, make sure that we haven't gone over one of the boundaries of the "border"
            if (newLeft < border.Left) newLeft = border.Left;
            if (newTop < border.Top) newTop = border.Top;
            if (newLeft + pb.Width > border.Right) newLeft = border.Right - pb.Width;
            if (newTop + pb.Height > border.Bottom) newTop = border.Bottom - pb.Height;
            //Finally, assign the new value
            pb.Left = newLeft;
            pb.Top = newTop;
        }
    }
}