Положение холста и изображения с помощью PdfFormXObject - PullRequest
0 голосов
/ 16 мая 2019

Я использую PdfFormXObject вместо PdfCanvas, чтобы применить фон, рамку и / или цвет фона к определенной области страницы (в основном потому, что PdfCanvas требуется страница для построения, PdfFormXObject нетПоскольку мой контент может длиться несколько страниц).Проблема в том, что изображение расположено не так, как ожидается, если координация (x = 0, y = 0) означает левый нижний угол.Я также хочу расположить Canvas в фиксированном положении, но canvas.SetFixedPosition(), похоже, не работает.Посмотрите прикрепленное исходное изображение и изображение, которое нужно расположить в {x, y, width, height} = {100f, 100f, 200f, 200f}, которое должно быть внизу страницы (а это не так), и оно также каким-то образом обрезано?

  1. код

    public void CreatePDF(string path)
    {
           var writer = new PdfWriter(path);
           var pdf = new PdfDocument(writer);
           var doc = new Document(pdf, PageSize.LETTER);
           doc.SetMargins(18, 18, 18, 18);
           var rect = new Rectangle(100f, 100f, 200f, 200f);
           var temp = new PdfFormXObject(new Rectangle(rect.GetWidth(), rect.GetHeight()));
           var ca = new Canvas(temp, pdf);
           // ca.SetFixedPosition(rect.GetLeft(), rect.GetBottom(), rect.GetWidth());
           var img = new Image(ImageDataFactory.Create(path));
           img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
           img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
           ca.Add(img);
           ca.SetBackgroundColor(ColorConstants.BLUE); // not shown blue bg
           ca.Close();
           doc.Add(new Image(temp));
           doc.Close();
           pdf.Close();
    }
    
  2. исходное изображение enter image description here

  3. сгенерированный (ошибочно расположен вверху) enter image description here

  4. update Вот рабочий код после направления mkl.Но холст не может установить границы / цвет фона:


       public void CreatePDF(string path)
       {
                var writer = new PdfWriter(path);
                var pdf = new PdfDocument(writer);
                var doc = new Document(pdf, PageSize.LETTER);
                doc.SetMargins(LETTER_MARGIN, LETTER_MARGIN, LETTER_MARGIN, LETTER_MARGIN);
                var rect = new Rectangle(100f, 300f, 200f, 200f);
                var w = Doc.GetPageEffectiveArea(PageSize.LETTER).GetWidth(); //576f
                var h = Doc.GetPageEffectiveArea(PageSize.LETTER).GetHeight();//756f
                var temp = new PdfFormXObject(new Rectangle(w, h));
                var ca = new Canvas(temp, pdf);

                ca.SetFixedPosition(0, 0, 576f);
                ca.SetBorder(new SolidBorder(1f));//not work
                ca.SetBackgroundColor(ColorConstants.BLUE);//not work

                var img = new Image(ImageDataFactory.Create(path));

                img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
                img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
                ca.Add(img);

                ca.Close();
                doc.Add(new Image(temp));

                doc.Close();
                pdf.Close();
     }

Обновление Я добавил Div в CA и установил границы и цвет фона для Div.Работает отлично.

TIA

1 Ответ

0 голосов
/ 16 мая 2019

Сначала вы создаете PdfFormXObject, используя прямоугольник, для которого вы только определяете ширину и высоту:

var temp = new PdfFormXObject(new Rectangle(rect.GetWidth(), rect.GetHeight()));

Таким образом, прямоугольник имеет нижний левый угол в начале системы координат формы хобъекта, то есть нижний левый угол (0,0), а верхний правый (200,200).

В этой области вы размещаете изображение 200 × 200 в (100,100):

img.SetFixedPosition(rect.GetLeft(), rect.GetBottom());
img.ScaleAbsolute(rect.GetWidth(), rect.GetHeight());
ca.Add(img);

Таким образом, большая часть изображения находится вне xobject, внутри находится только нижний левый квадрант, который вы видите на скриншоте.

Затем вы добавляете этот объект в документ без позиционирования:

doc.Add(new Image(temp));

Таким образом, вы просите itext поместить ваш 200x200 объект в том месте, где он соответствует существующему контенту. Так что он будет расположен дальше, чем вы хотите.

Поэтому, чтобы решить вашу проблему, расположите область объекта и положение изображения так, чтобы изображение находилось в этой области, и расположите объект по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...