以PDF格式自动提取pdf中突出显示的内容

时间:2012-01-19 17:35:58

标签: pdf image-processing

我有一个pdf文件,其中一些文本和图像使用高亮文本(U)工具突出显示。有没有办法自动提取所有突出显示的内容作为单独的图像并将其保存到文件夹?我不想要可读的文字。我只是希望所有突出显示的内容都是图像。感谢

2 个答案:

答案 0 :(得分:1)

您需要使用PDF库迭代所有Annotation对象及其属性,以查看哪些对象使用高亮注释。找到高亮注释后,您可以提取注释的位置和大小(边界框)。

获得注释边界框的列表后,您需要将PDF文件渲染为图像格式,例如PNG / JPEG / TIFF,以便您可以提取/剪裁所需注释文本的渲染图像。你可以使用GDI +或像LibTIFF这样的东西

有各种PDF库可以做到这一点,包括

http://www.quickpdflibrary.com(我咨询QuickPDF)或 http://www.itextpdf.com

这是一个基于快速PDF库的C#功能,可以满足您的需求。

    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());
    }

答案 1 :(得分:0)

您是希望每个文本作为单独的高亮显示还是单独窗格中的所有高亮显示?