Area selecion coordinate

6 posts, 1 answers
  1. Stefania
    Stefania avatar
    107 posts
    Member since:
    May 2013

    Posted 05 May Link to this post

    Hi,

    on a form I have a pdfviewer and I need to know where the user click on my pdf. The coordinates should be relative to the document not the all radpdfviewer area.

    When I get the coordinate with iTextSharp I'll put some image on that area (this part I'm already able to do it)

     

    Those are the possibilities that I thought:

    - Select an area on pdfviewer and get the coordinates? (THIS ONE WOULD BE THE BEST)

    OR

    - get the text selection position (I took a look to the documentation but I'm not able do reproduce the example.. this.PdfViewer.Document.CaretPosition is missing)

     

    Any other idea?

     

    Thank you

  2. Tanya
    Admin
    Tanya avatar
    405 posts

    Posted 09 May Link to this post

    Hello Stefania,

    We have a demo demonstrating a similar scenario using RadPdfViewer in combination with RadPdfProcessing. RadPdfViewer is used to visualize a PDF file and when the user clicks on it, the page index and location are obtained through the GetLocationFromViewPoint() method. The document is modified using the API of RadPdfProcessing, exported and opened. Please, find the sample project in the attachments. 

    However, if you prefer to stick to the approach with selection, you could check our help article that describes how you could create a TextSelection. After you have already selected the text, you could use the GetSelectionGeometry() method of the Selection in order to check the start position of the geometry that describes the selection.
    PathGeometry geometry = this.pdfViewer.Document.Selection.GetSelectionGeometry(this.pdfViewer.Document.Pages[0]);
    Point startPoint = geometry.Figures.First().StartPoint;

    Hope this helps.

    Regards,
    Tanya
    Telerik
    Do you need help with upgrading your AJAX, WPF or WinForms project? Check the Telerik API Analyzer and share your thoughts.
  3. UI for WPF is Visual Studio 2017 Ready
  4. Stefania
    Stefania avatar
    107 posts
    Member since:
    May 2013

    Posted 10 May in reply to Tanya Link to this post

    Hi. thank you Tanya for the reply.

    I can't find the sample project.. can you reattach it, please?

  5. Answer
    Tanya
    Admin
    Tanya avatar
    405 posts

    Posted 10 May Link to this post

    Hello Stefania,

    Please, excuse me for this - it seems like something failed. The sample project should be attached to this post.

    Regards,
    Tanya
    Telerik
    Do you need help with upgrading your AJAX, WPF or WinForms project? Check the Telerik API Analyzer and share your thoughts.
  6. Stefania
    Stefania avatar
    107 posts
    Member since:
    May 2013

    Posted 28 Oct Link to this post

    Hi, I just found an issue on the area selection coordinate when the pdf page is in landscape.

    How can I resolve it? (see the attachment)

    Here is my code

    XML

    <telerik:RadPdfViewer Grid.Column="1"  x:Name="pdfViewer"/>

     

    Code-behind

    private IFixedDocumentPresenter presenter = null;
    private double _xTL;
    private double _yTL;
    private double _xBR;
    private double _yBR;
    private int _pageN;
    private string _fullfilename;
     
    private UIElement Presenter
    {
        get
        {
            return this.presenter as UIElement;
        }
    }
     
    private void Initialize()
    {
        this.presenter = this.pdfViewer.FixedDocumentPresenter;
     
        if (this.Presenter != null)
        {
            this.Presenter.PreviewMouseDown += PresenterMouseDown;
        }
     
        this.pdfViewer.FixedDocumentPresenterChanged += FixedDocumentPresenterChanged;
    }
     
     
    private void FixedDocumentPresenterChanged(object sender, EventArgs e)
    {
        if (this.Presenter != null)
        {
            this.Presenter.PreviewMouseDown -= PresenterMouseDown;
        }
     
        this.presenter = this.pdfViewer.FixedDocumentPresenter;
        
        if (this.Presenter != null)
        {
            this.Presenter.PreviewMouseDown += PresenterMouseDown;
        }
    }
    public int clickCnt = 0;
         private void PresenterMouseDown(object sender, MouseButtonEventArgs e)
         {
             clickCnt++;
             System.Windows.Point position = e.GetPosition(this.Presenter);
     
             RadFixedPage page;
             System.Windows.Point location;
             if (this.pdfViewer.FixedDocumentPresenter.GetLocationFromViewPoint(position, out page, out location))
             {
                 int pageIndex = page.PageNo;
                 var rotation = page.Rotation; //ALWAYS Rotate0
     
                 _pageN = pageIndex;
     
                 //negative coordinates error
                 if (location.X < 0 || location.Y < 0)
                 {
                     SSCGlobalMessageBox.Show("0212", "WO");
                     clickCnt = 0;
                     return;
                 }
     
                 if (clickCnt == 1)
                 {                
                     _xTL = location.X;
                     _yTL = location.Y;
                 }
                 else if (clickCnt == 2)
                 {             
                     //Y > perchè 0,0 è in alto a sx
                     if (_xTL > location.X || _yTL > location.Y)
                     {
                         SSCGlobalMessageBox.Show("0211", "WO");
                         clickCnt = 0;
                         return;
                     }
                     _xBR = location.X;
                     _yBR = location.Y;
     
                     //save area
                     DocumentTypeSettingsAreaEntity area = new DocumentTypeSettingsAreaEntity();
                     area.DocumentTypeId = (int)documentType.Id;
                     area.ProjectId = (int)documentType.ProjectId;
                     area.AxisX = (decimal)_xTL;// Convert.ToDecimal(XPointTL.Text);
                     area.AxisY = (decimal)_yTL;// Convert.ToDecimal(YPointTL.Text);
                     area.Pages = _pageN.ToString();//PdfPage.Text;
                     area.Width = (decimal)(_xBR - _xTL);//Convert.ToDecimal(XPointBR.Text) - Convert.ToDecimal(XPointTL.Text);
                     area.Height = (decimal)(_yBR - _yTL);//Convert.ToDecimal(YPointBR.Text) - Convert.ToDecimal(YPointTL.Text);
                     area.RECORD_STATUS = STATUS_TYPE.ADDED;
                     ((DocumentTypeEntity)this.DataContext).DocumentTypeSettingsAree.Add(area);
                   
                     //preview
                     if (string.IsNullOrEmpty(_fullfilename))
                         return;
     
                     this.ManipulateDocument();
                     clickCnt = 0;
                 }              
             }
         }

     

    private void ManipulateDocument(bool newArea = false)
            {
                using (new WpfWaitCursor())
                {
                    PdfFormatProvider pdfProcessingProvider = new PdfFormatProvider();
     
                    using (System.IO.Stream inputPdfStream = new System.IO.FileStream(_fullfilename, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
                    {
                        RadFixedDocument document = pdfProcessingProvider.Import(inputPdfStream);
     
                        //FOREACH RECTANGLE SAVED
                        foreach (var record in (this.DataContext as DocumentTypeEntity).DocumentTypeSettingsAree)
                        {
                            if (string.IsNullOrEmpty(record.Pages))
                                continue;
                            System.Windows.Point location = new Point((double)record.AxisX, (double)record.AxisY);
     
                            HashSet<int> pages = new HashSet<int>();
     
                            #region TROVO LE PAGINE
     
                            if (record.Pages.Equals("*"))
                            {
                                int totpag = document.Pages.Count();
                                for (int c = 0; c < totpag; c++)
                                {
                                    pages.Add(c + 1);
                                }
                            }
                            else if (record.Pages.Length == 1)
                            {
                                int pag;
                                int.TryParse(record.Pages, out pag);
     
                                pages.Add(pag);
                            }
                            else
                            {
                                string[] tmp = record.Pages.Split(',');
     
                                foreach (var p in tmp)
                                {
                                    string[] tmp2 = p.Split('-');
     
                                    if (tmp2.Length == 1)
                                        pages.Add(Convert.ToInt32(tmp2[0]));
                                    else
                                    {
                                        int pagFrom = Convert.ToInt32(tmp2[0]);
                                        int pagTo = Convert.ToInt32(tmp2[1]);
     
                                        for (int x = pagFrom; x <= pagTo; x++)
                                        {
                                            pages.Add(x);
                                        }
                                    }
                                }
                            }
                            #endregion
     
                            foreach (var p in pages)
                            {
                                if (p <= document.Pages.Count()) //if page > total pages skip
                                {                               
                                    int pageN = p - 1;//Convert.ToInt32(record.Pages) - 1;
                              /*      var rotation = document.Pages[pageN].Rotation;
                                    double rotationGrade = 0;
     
                                    switch(rotation)
                                    {
                                        case Telerik.Windows.Documents.Fixed.Model.Data.Rotation.Rotate90:
                                            rotationGrade = 90;
                                            break;
     
                                        case Telerik.Windows.Documents.Fixed.Model.Data.Rotation.Rotate180:
                                            rotationGrade = 180;
                                            break;
                                        case Telerik.Windows.Documents.Fixed.Model.Data.Rotation.Rotate270:
                                            rotationGrade = 270;
                                            break;                                       
                                    }
    */
                                     
                                    FixedContentEditor editor = new FixedContentEditor(document.Pages[pageN]);
                                     
                                    editor.Position.Translate(location.X, location.Y);
                                  //  editor.Position.Rotate(rotationGrade);
     
                                    Rect r = new Rect(new Size((double)record.Width, (double)record.Height));
                                     
                                    if (newArea)
                                        editor.GraphicProperties.FillColor = new RgbColor(0, 255, 0);
                                    else
                                        editor.GraphicProperties.FillColor = new RgbColor(255, 128, 0);
                                    editor.DrawRectangle(r);
     
                                    editor.GraphicProperties.FillColor = new RgbColor(0, 0, 0);
     
                                    string description = "TEST";                             
                                    editor.DrawText(description);
                                }
                            }
                        }
     
                        //load pdf
                        MemoryStream m_Stream = new MemoryStream();
                        pdfProcessingProvider.Export(document, m_Stream);
     
                        RadFixedDocument fixeddocument = new PdfFormatProvider(m_Stream, FormatProviderSettings.ReadOnDemand).Import();
                        pdfViewer.Document = fixeddocument;
     
                    }
                }
            }
  7. Deyan
    Admin
    Deyan avatar
    136 posts

    Posted 02 Nov Link to this post

    Hello Stefania,

    We have managed to reproduce the incorrect positioning when page Rotation value is different from Rotate0. We are attaching a modified version of the sample project showing how to position the FixedContentEditor so that the added image is positioned correctly on pages with different rotations. You may take a look at AdjustEditorPosition() method in order to see how exactly these calculations are performed. The modified demo uses sample document with different page sizes and page rotations - Rotate0, Rotate180, Rotate90 and Rotate270 respectively. You may test that all scenarios are working correctly by clicking on different document pages.

    I hope this is helpful. If you have any other questions or concerns please do not hesitate to contact us again.

    Regards,
    Deyan
    Telerik by Progress
    Do you need help with upgrading your WPF project? Try the Telerik API Analyzer and share your thoughts!
Back to Top
UI for WPF is Visual Studio 2017 Ready