Извлечение выделенного содержимого в PDF автоматически в виде изображений - PullRequest
1 голос
/ 19 января 2012

У меня есть PDF-файл, в котором текст и изображения выделены с помощью инструмента выделения текста (U). Есть ли способ автоматически извлечь весь выделенный контент как отдельные изображения и сохранить его в папке? Я не хочу читабельный текст. Я просто хочу, чтобы весь выделенный контент был в виде изображений. Спасибо

Ответы [ 2 ]

1 голос
/ 20 января 2012

Вам потребуется использовать библиотеку PDF, чтобы перебрать все объекты Annotation и их свойства, чтобы увидеть, какие из них используют аннотацию подсветки.Найдя выделенную аннотацию, вы можете извлечь положение и размер (ограничивающую рамку) аннотации.

Получив список ограничивающих рамок для аннотации, вам нужно будет представить файл PDF в изображение.формат, такой как PNG / JPEG / TIFF, чтобы можно было извлечь / обрезать визуализированное изображение нужного текста аннотации.Вы можете использовать GDI + или что-то вроде LibTIFF

. Существуют различные библиотеки PDF, которые могут сделать это, включая

http://www.quickpdflibrary.com (я обращаюсь к QuickPDF) или http://www.itextpdf.com

Вот функция C #, основанная на Quick PDF Library, которая делает то, что вам нужно.

    private void ExtractAnnots_Click(object sender, EventArgs e)
    {
        int dpi = 300;
        Rectangle r;
        List<Rectangle> annotList = new List<Rectangle>();

        QP.LoadFromFile("samplefile.pdf", "");

        for (int p = 1; p <= QP.PageCount(); p++)
        {
            QP.SelectPage(p);  // Select the current page.
            QP.SetOrigin(1);   // Set origin to top left.

            annotList.Clear();

            for (int i = 1; i <= QP.AnnotationCount(); i++)
            {
                if (QP.GetAnnotStrProperty(i, 101) == "Highlight")
                {
                    r = new Rectangle((int)(QP.GetAnnotDblProperty(i, 105) * dpi / 72.0),  // x
                                      (int)(QP.GetAnnotDblProperty(i, 106) * dpi / 72.0),  // y
                                      (int)(QP.GetAnnotDblProperty(i, 107) * dpi / 72.0),  // w
                                      (int)(QP.GetAnnotDblProperty(i, 108) * dpi / 72.0)); // h

                    annotList.Add(r); // Add the bounding box to the annotation list for this page.

                    string s = String.Format("page={0}: x={1} y={2} w={3} h={4}\n", p, r.X, r.Y, r.Width, r.Height);
                    OutputTxt.AppendText(s);
                }
            }

            // Now we have a list of annotations for the current page.
            // Delete the annotations from the PDF in memory so we don't render them.

            for (int i = QP.AnnotationCount(); i >= 0;  i--)   
                QP.DeleteAnnotation(i);

            QP.RenderPageToFile(dpi, p, 0, "page.bmp");   // 300 dpi, 0=bmp
            Bitmap bmp = Image.FromFile("page.bmp") as Bitmap; 

            for (int i=0;i<annotList.Count;i++)
            {
                Bitmap cropped = bmp.Clone(annotList[i], bmp.PixelFormat);

                string filename = String.Format("annot_p{0}_{1}.bmp", p, i+1);
                cropped.Save(filename);
            }

            bmp.Dispose();
        }

        QP.RemoveDocument(QP.SelectedDocument());
    }
0 голосов
/ 20 января 2012

Хотите ли вы, чтобы каждый фрагмент текста был выделен отдельно или все выделения выделены на отдельной панели?

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