PDFsharp извлечение проблем с флажками изображений - PullRequest
0 голосов
/ 19 февраля 2019

Мне нужно извлечь флажки из файла PDF.Там нет акрополей или что-то в этом роде.Существует требование использовать библиотеку PDFsharp или другую бесплатную.Я не могу использовать iTextSharp, потому что это не бесплатно для коммерческого использования.
Я нашел некоторый код для извлечения изображений со страниц, но он приносит мне 4 объекта, и два из них - изображения.Я предполагаю, что они могут быть помечены галочкой и сняты флажки для изображения страницы, но мне нужно взять все ссылки на изображения со страницы, потому что на каждой странице есть около 15 флажков, и мне нужно знать, какие щелкнули и какиене является.Единственный способ сделать это - извлечь все изображения со страницы и проверить, нажали они или нет.Код, который я использую в настоящее время:

using (PdfDocument doc = PdfReader.Open(path))
    {
        foreach (PdfPage page in doc.Pages)
        {
            PdfDictionary resources = page.Elements.GetDictionary("/Resources");
            if (resources != null)
            {
                // Get external objects dictionary
                PdfDictionary xObjects = resources.Elements.GetDictionary("/XObject");
                if (xObjects != null)
                {
                    ICollection<PdfItem> items = xObjects.Elements.Values;

                    // Iterate references to external objects
                    foreach (PdfItem item in items)
                    {
                        PdfReference reference = item as PdfReference;
                        if (reference != null)
                        {
                            PdfDictionary xObject = reference.Value as PdfDictionary;
                            // Is external object an image?
                            if (xObject != null && xObject.Elements.GetString("/Subtype") == "/Image")
                            {
                                // do something with your image here 
                                // only the first image is handled here
                                var bitmap = ExportImage(xObject);
                                bitmap.Save($@"C:\Users\tishk\Desktop\exported{imageCount++}.png", ImageFormat.Bmp);
                            }
                        }
                    }
                }
            }
        }
    }
}

private static Bitmap ExportImage(PdfDictionary image)
{
    string filter = image.Elements.GetName("/Filter");
    switch (filter)
    {
        case "/FlateDecode":
            return ExportAsPngImage(image);

        default:
            throw new ApplicationException(filter + " filter not implemented");
    }
}

private static Bitmap ExportAsPngImage(PdfDictionary image)
{
    int width = image.Elements.GetInteger(PdfImage.Keys.Width);
    int height = image.Elements.GetInteger(PdfImage.Keys.Height);
    int bitsPerComponent = image.Elements.GetInteger(PdfImage.Keys.BitsPerComponent);

    var canUnfilter = image.Stream.TryUnfilter();
    var decoded = image.Stream.Value;

    Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
    BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
    Marshal.Copy(decoded, 0, bmpData.Scan0, decoded.Length);
    bmp.UnlockBits(bmpData);

    return bmp;
}
...