Вырезать прямоугольник со страницы и поместить на другую страницу с помощью iText7

#c# #winforms #pdf #methods #itext7

#c# #winforms #PDF #методы #itext7

Вопрос:

Я хочу скопировать местоположение размером с прямоугольник и поместить на другую страницу. Например. У меня есть 100 страниц, и я хочу вырезать прямоугольник на 54 страницы, который находится в x , y и имеет width , height координаты, и поместить его на страницу 3.
Мой метод выглядит следующим образом:

 public void CopyRect(string filenamePdf, 
                     Rectangle rect, 
                     int sourcePageNumber, 
                     int destinationPageNumber)
{
}
  
  • string filenamePdf — это мой исходный PDF-файл
  • прямоугольник rect — это мои координаты (x, y, ширина, высота)
  • int sourcePageNumber — это страница, с которой я хочу скопировать этот прямоугольник с информацией
  • int destinantionPageNumber — это страница, на которой я хочу поместить этот прямоугольник с информацией.

Как я должен описать этот метод? Спасибо.

Комментарии:

1. В заголовке вы говорите сократить , но в этом вопросе организм скажет вам копию ; чего вы действительно хотите? И где на целевой странице вы хотите разместить раздел? Как насчет аннотаций?

2. извините за ошибку, я хочу вырезать.

Ответ №1:

Здесь я нашел решение:

  public void CopyRectCopy(string filenamePdf,
                          Rectangle rect,
                          int sourcePageNumber,
                          int destinationPageNumber)
    {
        PdfDocument srcDoc = new PdfDocument(new PdfReader(filenamePdf));
        PdfDocument resultPdfDoc = new PdfDocument(newPdfWriter(@"C:UsersUSER123"));
        int pageCounter = srcDoc.GetNumberOfPages();
        Rectangle toMove = rect;
        Rectangle pageSize = srcDoc.GetPage(sourcePageNumber).GetPageSize();
        PdfFormXObject pageXObject = srcDoc.GetPage(sourcePageNumber).CopyAsFormXObject(resultPdfDoc);


        PdfFormXObject formXObjectA = new PdfFormXObject(pageSize);
        for (int i = 1; i <= pageCounter; i  )
        {
            //deletes an rectangle from exact page.
            if (i == sourcePageNumber)
            {
                resultPdfDoc.AddNewPage();

                PdfCanvas canvasas = new PdfCanvas(formXObjectA, resultPdfDoc);
                canvasas.Rectangle(0, 0, 595.28, 841.89);
                canvasas.Rectangle(toMove);
                canvasas.EoClip();
                canvasas.EndPath();
                canvasas.AddXObject(pageXObject, 0, 0);
            }
            else
            {
                srcDoc.CopyPagesTo(i, i, resultPdfDoc);
            }

        }
        // Create a formXObject of the area to move.
        PdfFormXObject formXObject2 = new PdfFormXObject(pageSize);
        PdfCanvas canvas2 = new PdfCanvas(formXObject2, resultPdfDoc);
        canvas2.Rectangle(toMove);
        // This method uses the nonzero winding rule to determine which regions lie inside the clipping path.
        canvas2.Clip();
        canvas2.EndPath();
        canvas2.AddXObject(pageXObject, 0, 0);


        PdfCanvas canvas = new PdfCanvas(resultPdfDoc.GetPage(destinationPageNumber));
        PdfCanvas canvass = new PdfCanvas(resultPdfDoc.GetPage(sourcePageNumber));
        // Add the area to move content, shifted 10 points to the left and 2 points to the bottom.
        canvas.AddXObject(formXObject2, 0, -50);
        canvass.AddXObject(formXObjectA, 0, 0);

        srcDoc.Close();
        resultPdfDoc.Close();
    }
  

Он вырезает прямоугольник с одной страницы и вставляет на другую.

ОТРЕДАКТИРОВАНО.

Комментарии:

1. Насколько я вижу, вы нигде не помещаете formXObject1 . В остальном решение выглядит нормально. Однако есть некоторые недостатки, в частности, ваше решение, скорее всего, удалит аннотации и информацию на уровне документа. В зависимости от ваших входных данных, это может быть нормально.