Мне нужно извлечь флажки из файла 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;
}