Как найти текущую (X, Y) позицию в iTextSharp? - PullRequest
4 голосов
/ 07 октября 2011

Мне нужно создать PDF с несколькими разделами, а после каждого раздела нужно добавить линию, но я не знаю, где нарисовать эту линию.

Мне нужно найти точные координаты [x, y], куда будет записан следующий элемент в документе.

Ответы [ 4 ]

8 голосов
/ 07 октября 2011

Как сказал @Olaf, используйте GetVerticalPosition, чтобы получить Y.X - это просто LeftMargin документа.Ниже представлено полнофункциональное приложение WinForms, предназначенное для iTextSharp 5.1.1.0, которое, мы надеемся, сделает то, что вы ищете:

using System;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Test file name
            string TestFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");

            //Standard iTextSharp setup
            using (FileStream fs = new FileStream(TestFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (Document doc = new Document(PageSize.LETTER))
                {
                    using (PdfWriter w = PdfWriter.GetInstance(doc, fs))
                    {
                        //Open the document for writing
                        doc.Open();

                        //Will hold our current x,y coordinates;
                        float curY;
                        float curX;

                        //Add a paragraph
                        doc.Add(new Paragraph("It was the best of times"));

                        //Get the current Y value
                        curY = w.GetVerticalPosition(true);

                        //The current X is just the left margin
                        curX = doc.LeftMargin;

                        //Set a color fill
                        w.DirectContent.SetRGBColorStroke(0, 0, 0);
                        //Set the x,y of where to start drawing
                        w.DirectContent.MoveTo(curX, curY);
                        //Draw a line
                        w.DirectContent.LineTo(doc.PageSize.Width - doc.RightMargin, curY);
                        //Fill the line in
                        w.DirectContent.Stroke();

                        //Add another paragraph
                        doc.Add(new Paragraph("It was the word of times"));

                        //Repeat the above. curX never really changes unless you modify the document's margins
                        curY = w.GetVerticalPosition(true);

                        w.DirectContent.SetRGBColorStroke(0, 0, 0);
                        w.DirectContent.MoveTo(curX, curY);
                        w.DirectContent.LineTo(doc.PageSize.Width - doc.RightMargin, curY);
                        w.DirectContent.Stroke();


                        //Close the document
                        doc.Close();
                    }
                }
            }

            this.Close();
        }
    }
}
7 голосов
/ 07 октября 2011

Я полагаю, что доступна только y-позиция: try

PdfWriter.getVerticalPosition()
2 голосов
/ 05 июня 2013

На самом деле есть только y-позиция.

Но если нужно отрисовать какой-нибудь простой текст и после этого поставить картинку или нарисовать линию, он всегда может посчитать размер отрисованного текста:

var chunk = new Chunk(String.Format("Sample text {0}", ));                                                             
document.Add(new Paragraph(t));
float curY = writer.GetVerticalPosition(false);
float x = document.Left + chunk.GetWidthPoint();
1 голос
/ 15 июля 2016

Если вам просто нужно нарисовать линию после текущего раздела, возможно, вам не нужно знать текущие x и y.Попробуйте это:

        iTextSharp.text.pdf.draw.DottedLineSeparator sepLINE = new iTextSharp.text.pdf.draw.DottedLineSeparator();

        sepLINE.LineWidth = 1;
        sepLINE.Gap = 2;
        sepLINE.Percentage = 50;
        sepLINE.LineColor = new iTextSharp.text.BaseColor(System.Drawing.Color.Blue);

        Chunk chnkLINE = new Chunk(sepLINE);
        pdfDoc.Add(chnkLINE);
...