Выделить элемент в формате PDF на основе координат c # - PullRequest
2 голосов
/ 03 июня 2019

У меня есть 5 страниц pdf, нужно выделить определенный элемент на основе координат

Иметь X top left,Y top left,X top right ,Y top right , X bottom right , Y bottom right ,X bottom left, Y bottom left.

Я попробовал приведенный ниже код, используя iTextsharp, пожалуйста, предложите, как мы можем это сделать, включая страницу №

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


//Create a simple test file
string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf");

//Create a new file from our test file with highlighting
string highLightFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Highlighted.pdf");

//Bind a reader and stamper to our test PDF
PdfReader reader = new PdfReader(outputFile);

using (FileStream fs = new FileStream(highLightFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
    using (PdfStamper stamper = new PdfStamper(reader, fs))
    {
        //Create a rectangle for the highlight. NOTE: Technically this isn't used but it helps with the quadpoint calculation
        iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);
        //Create an array of quad points based on that rectangle. NOTE: The order below doesn't appear to match the actual spec but is what Acrobat produces
        float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };

        //Create our hightlight
        PdfAnnotation highlight = PdfAnnotation.CreateMarkup(stamper.Writer, rect, null, PdfAnnotation.MARKUP_HIGHLIGHT, quad);

        //Set the color
        highlight.Color = BaseColor.YELLOW;

        //Add the annotation
        stamper.AddAnnotation(highlight,1);
    }
}

Вывод Выделите элемент в прямоугольнике.Необходимо выделить 3-ю страницу PDF.

"boundingBox": [3.2924,7.7146,5.7564,7.7038,5.7671,7.9836,3.3032,7.9943]

этот "текст": "66 66 6666 6666" должен быть выделен

Входной файл Выходной файл

1 Ответ

1 голос
/ 04 июня 2019

Неправильная страница

Прежде всего, вы добавляете аннотацию к неправильной странице.

Вы говорите

Нужно выделить 3-ю страницу PDF.

но вы поместили это на страницу 1:

stamper.AddAnnotation(highlight,1);

Чтобы исправить это, измените номер страницы там:

stamper.AddAnnotation(highlight,3);

Неправильные координаты

Ни координаты в вашем коде

iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(60.6755f, 749.172f, 94.0195f, 735.3f);

, ни те, которые вы указали JSON'ish

"boundingBox": [3.2924,7.7146,5.7564,7.7038,5.7671,7.9836,3.3032,7.9943]

, не расположены рядом с местом, которое вы хотите выделить, по крайней мере, не вобычная система координат PDF, заданная медиа-блоком страницы.Измеряя в Adobe Acrobat, я получил следующие приблизительные координаты:

iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(240f, 264f, 413f, 289f);

Если какая-либо из показанных вами координат подразумевает фактические координаты части изображения, которую нужно выделить, спросите поставщика этих координат о координатесистема используется и соответственно преобразуется в координаты в медиа-окне данной страницы.

сомнительный порядок в QuadPoints

Вы создаете quad, используя этот порядок:

float[] quad = { rect.Left, rect.Bottom, rect.Right, rect.Bottom, rect.Left, rect.Top, rect.Right, rect.Top };

Это приводит кв вогнутых колпачках.Возможно, вы захотите использовать

float[] quad = { rect.Left, rect.Top, rect.Right, rect.Top, rect.Left, rect.Bottom, rect.Right, rect.Bottom };

, который Adobe Reader отображает в виде выпуклых заглавных букв.Для фона прочитайте этот ответ .

Пример вывода

Вы говорите:

"66 66 6666 6666" должно быть выделено

После трех изменений, примененных к вашему коду, я получаю:

screenshot

...