Example #1
0
        /// <summary>
        /// Match the blob
        /// </summary>
        /// <param name="configuration">ADR configuration</param>
        /// <param name="blob">Blob to match</param>
        /// <returns>Best match if exists, else null</returns>
        public ADRResult Match(byte[] configuration, byte[] blob)
        {
            ADRResult result           = null;
            var       tempPathId       = Guid.NewGuid();
            var       maxIdentityValue = 0.0;

            using (var gdPictureImaging = GdPictureHelper.GetImagingInstance())
            {
                var path     = $"{temporaryDataDirectory}\\ADR\\";
                var fullPath = $"{path}{tempPathId}.dat";

                DirectoryHelper.CreateDirectoryIfNotExists(path);

                File.WriteAllBytes(fullPath, configuration);
                gdPictureImaging.ADRLoadTemplateConfig(fullPath);

                int imageId = gdPictureImaging.CreateGdPictureImageFromByteArray(blob);
                if (imageId != 0)
                {
                    try
                    {
                        int closerTemplateID = gdPictureImaging.ADRGetCloserTemplateForGdPictureImage(imageId);
                        if (closerTemplateID != 0)
                        {
                            var tag      = gdPictureImaging.ADRGetTemplateTag(closerTemplateID);
                            var accuracy = Math.Round(gdPictureImaging.ADRGetLastConfidence(), 2);

                            if (accuracy > maxIdentityValue)
                            {
                                result = new ADRResult()
                                {
                                    Tag      = tag,
                                    Accuracy = accuracy
                                };

                                maxIdentityValue = accuracy;
                            }
                        }
                    }
                    finally
                    {
                        gdPictureImaging.ReleaseGdPictureImage(imageId);
                    }

                    // Remove path
                    if (File.Exists(fullPath))
                    {
                        File.Delete(fullPath);
                    }
                }
            }

            return(result);
        }
Example #2
0
        /// <summary>
        /// Load image
        /// </summary>
        /// <param name="image">Image object</param>
        /// <returns>True if loading was successfull</returns>
        public bool LoadImage(byte[] image)
        {
            Dispose();

            imaging = GdPictureHelper.GetImagingInstance();
            imageId = imaging.CreateGdPictureImageFromByteArray(image);

            isMultipageImage = imaging.TiffIsMultiPage(imageId);

            if (isMultipageImage)
            {
                PageCount = imaging.TiffGetPageCount(imageId);
            }
            else
            {
                PageCount = imaging.GetPageCount(imageId);
            }

            ImageHeight = imaging.GetHeight(imageId);

            return(imageId != 0);
        }
Example #3
0
        /// <summary>
        /// Create adr Configuration
        /// </summary>
        /// <param name="configuration">List of configuration objects</param>
        /// <returns>Configuration as byte-array</returns>
        public byte[] CreateConfiguration(IList <ADRConfiguration> configurations)
        {
            byte[] result = null;

            var tempPathId = Guid.NewGuid();

            var path     = $"{temporaryDataDirectory}\\ADR\\";
            var fullPath = $"{path}{tempPathId}.dat";

            DirectoryHelper.CreateDirectoryIfNotExists(path);

            using (var gdPictureImaging = GdPictureHelper.GetImagingInstance())
            {
                // Add images
                foreach (var configuration in configurations)
                {
                    int imageId = gdPictureImaging.CreateGdPictureImageFromByteArray(configuration.Blob);
                    if (imageId != 0)
                    {
                        int templateId = gdPictureImaging.ADRCreateTemplateEmpty();
                        gdPictureImaging.ADRSetTemplateTag(templateId, configuration.Tag);
                        gdPictureImaging.ADRAddGdPictureImageToTemplate(templateId, imageId);

                        gdPictureImaging.ReleaseGdPictureImage(imageId);
                    }
                }

                // Save file, get content and delete
                if (gdPictureImaging.ADRSaveTemplateConfig(fullPath))
                {
                    result = File.ReadAllBytes(fullPath);
                    File.Delete(fullPath);
                }

                return(result);
            }
        }
        /// <summary>
        /// Split pdf by page range
        /// </summary>
        /// <param name="image">Pdf to split</param>
        /// <param name="ranges">List of page ranges</param>
        /// <returns>List of splitted pdfs</returns>
        public IList <ImageSplitResult> Split(byte[] image, IList <PageNumberRange> ranges)
        {
            var result = new List <ImageSplitResult>();

            using (var gdPictureImage = GdPictureHelper.GetImagingInstance())
            {
                int imageId           = gdPictureImage.CreateGdPictureImageFromByteArray(image);
                int singlePageImageId = 0;

                if (!gdPictureImage.TiffIsMultiPage(imageId))
                {
                    singlePageImageId = imageId;
                    imageId           = gdPictureImage.TiffCreateMultiPageFromGdPictureImage(imageId);
                }

                if (singlePageImageId != 0)
                {
                    gdPictureImage.ReleaseGdPictureImage(singlePageImageId);
                }

                if (ranges == null || ranges.Count == 0)
                {
                    return new List <ImageSplitResult> {
                    }
                }
                ;

                foreach (var range in ranges.Where(x => x.PageCount > 0 && x.StartPageNumber + (x.PageCount - 1) <= gdPictureImage.TiffGetPageCount(imageId)))
                {
                    var newImageId = gdPictureImage.TiffCreateMultiPageFromGdPictureImage(imageId);

                    for (int i = 1; i <= gdPictureImage.TiffGetPageCount(newImageId); i++)
                    {
                        gdPictureImage.TiffDeletePage(newImageId, i);
                    }

                    for (int i = 0; i < range.PageCount; i++)
                    {
                        gdPictureImage.SelectPage(imageId, range.StartPageNumber + i);
                        gdPictureImage.TiffAppendPageFromGdPictureImage(newImageId, imageId);
                    }

                    using (var targetStream = new MemoryStream())
                    {
                        gdPictureImage.SaveAsStream(newImageId, targetStream, GdPicture14.DocumentFormat.DocumentFormatTIFF, 4);
                        targetStream.Position = 0;
                        result.Add(new ImageSplitResult
                        {
                            Image       = targetStream.ToArray(),
                            PageCount   = range.PageCount,
                            Barcode     = range.Barcode,
                            BarcodeType = range.BarcodeType
                        });

                        gdPictureImage.ReleaseGdPictureImage(newImageId);
                    }
                }

                gdPictureImage.ReleaseGdPictureImage(imageId);
            }

            return(result);
        }
    }
Example #5
0
        public byte[] Convert(byte[] data, bool embeddOCRText = true, string language = "deu")
        {
            byte[] pdf = null;

            using (var pdfInstance = GdPictureHelper.GetPDFInstance())
            {
                using (var gdPictureImaging = GdPictureHelper.GetImagingInstance())
                {
                    int imageId = gdPictureImaging.CreateGdPictureImageFromByteArray(data);
                    if (gdPictureImaging.GetStat() == GdPictureStatus.OK)
                    {
                        float           resolution = System.Math.Max(200, gdPictureImaging.GetVerticalResolution(imageId));
                        GdPictureStatus state      = GdPictureStatus.OK;

                        if (embeddOCRText)
                        {
                            state = pdfInstance.NewPDF(PdfConformance.PDF_A_1a);
                        }
                        else
                        {
                            state = pdfInstance.NewPDF();
                        }

                        if (state == GdPictureStatus.OK)
                        {
                            for (int i = 1; i <= gdPictureImaging.GetPageCount(imageId); i++)
                            {
                                if (gdPictureImaging.SelectPage(imageId, i) == GdPictureStatus.OK)
                                {
                                    var addImageResult = pdfInstance.AddImageFromGdPictureImage(imageId, false, true);
                                }
                            }

                            // pdfInstance.OcrPages("*", 1, language, GdPictureHelper.OCRDirectory, "", resolution, 0, true);

                            using (var stream = new MemoryStream())
                            {
                                pdfInstance.SaveToStream(stream);
                                stream.Position = 0;
                                pdf             = stream.ToArray();
                            }
                        }
                        else
                        {
                            throw new Exception($"Culd not convert document. State: {state}");
                        }

                        // Release gdpicture image
                        gdPictureImaging.ReleaseGdPictureImage(imageId);
                    }
                    else
                    {
                        throw new Exception("Could not create gdpicture imaging instance");
                    }

                    // Close pdf document
                    pdfInstance?.CloseDocument();
                }
            }

            return(pdf);
        }
        /// <summary>
        /// Execute barcode recognition
        /// </summary>
        /// <param name="blob">Blob to test</param>
        /// <param name="fileExtension">file extension</param>
        /// <returns>List of detected barcodes</returns>
        public IList <BarcodeRecognitionResult> Process(byte[] blob, string fileExtension)
        {
            var results = new List <BarcodeRecognitionResult>();

            byte[] imgData = blob;
            if (fileExtension?.ToLower()?.Replace(".", "") == "pdf")
            {
                imgData = pdfToTiffService.Convert(blob);
            }

            using (var gdPictureImage = GdPictureHelper.GetImagingInstance())
            {
                int imageID = 0;

                try
                {
                    imageID = gdPictureImage.CreateGdPictureImageFromByteArray(imgData);
                    gdPictureImage.TiffOpenMultiPageForWrite(true);

                    if (!gdPictureImage.TiffIsMultiPage(imageID))
                    {
                        int imagetmp = imageID;
                        imageID = gdPictureImage.TiffCreateMultiPageFromGdPictureImage(imagetmp);
                        gdPictureImage.ReleaseGdPictureImage(imagetmp);
                    }

                    int pageCount = gdPictureImage.TiffGetPageCount(imageID);

                    for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
                    {
                        gdPictureImage.SelectPage(imageID, pageNumber);
                        if (gdPictureImage.BarcodeQRReaderDoScan(imageID, BarcodeQRReaderScanMode.BestQuality) == GdPictureStatus.OK)
                        {
                            int barcodeCount = gdPictureImage.BarcodeQRReaderGetBarcodeCount();

                            for (int i = 1; i <= barcodeCount; i++)
                            {
                                results.Add(new BarcodeRecognitionResult
                                {
                                    Barcode     = gdPictureImage.BarcodeQRReaderGetBarcodeValue(i),
                                    BarcodeType = "QR",
                                    Page        = pageNumber
                                });
                            }
                        }
                    }

                    gdPictureImage.BarcodeQRReaderClear();
                    gdPictureImage.ReleaseGdPictureImage(imageID);
                }
                catch
                {
                    if (imageID != 0)
                    {
                        gdPictureImage.BarcodeQRReaderClear();
                        gdPictureImage.ReleaseGdPictureImage(imageID);
                    }

                    throw;
                }
            }

            return(results);
        }
Example #7
0
        /// <summary>
        /// Execute barcode recognition
        /// </summary>
        /// <param name="blob">Blob to test</param>
        /// <param name="fileExtension">file extension</param>
        /// <param name="options">Settings/options</param>
        /// <returns>List of detected barcodes</returns>
        public IList <BarcodeRecognitionResult> Process(byte[] blob, string fileExtension, BarcodeRecognitionOption options)
        {
            var result = new List <BarcodeRecognitionResult>();

            var barcodeTypes = Barcode1DReaderType.Barcode1DReaderCode128 | Barcode1DReaderType.Barcode1DReaderEAN13 | Barcode1DReaderType.Barcode1DReaderCode39;

            if (options.BarcodeTypes != null && options.BarcodeTypes.Any())
            {
                barcodeTypes = Barcode1DReaderType.Barcode1DReaderNone;

                foreach (var type in options.BarcodeTypes)
                {
                    if (string.IsNullOrWhiteSpace(type))
                    {
                        continue;
                    }

                    barcodeTypes = barcodeTypes | (Barcode1DReaderType)Enum.Parse(typeof(Barcode1DReaderType), $"Barcode1DReader{type}", true);
                }
            }

            using (var gdPictureImage = GdPictureHelper.GetImagingInstance())
            {
                if (fileExtension?.Replace(".", "")?.ToLower() == "pdf")
                {
                    using (var stream = new MemoryStream(blob))
                    {
                        using (var gdPicturePdf = GdPictureHelper.GetPDFInstance())
                        {
                            stream.Position = 0;
                            gdPicturePdf.LoadFromStream(stream);

                            var pageCount = gdPicturePdf.GetPageCount();
                            for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
                            {
                                gdPicturePdf.SelectPage(pageNumber);

                                var imageID = gdPicturePdf.RenderPageToGdPictureImageEx(options.PdfToTiffDPI, true);

                                if (options.ConvertToBlackAndWhite)
                                {
                                    gdPictureImage.FxBlackNWhite(imageID, BitonalReduction.Stucki);
                                    gdPictureImage.ConvertTo1BppFast(imageID);
                                }

                                var status = gdPictureImage.Barcode1DReaderDoScan(imageID, Barcode1DReaderScanMode.BestQuality, barcodeTypes, false, 1);
                                if (status == GdPictureStatus.OK)
                                {
                                    var barcodeAmount = gdPictureImage.Barcode1DReaderGetBarcodeCount();

                                    for (int i = 1; i <= barcodeAmount; i++)
                                    {
                                        result.Add(new BarcodeRecognitionResult
                                        {
                                            Barcode     = gdPictureImage.Barcode1DReaderGetBarcodeValue(i),
                                            Page        = pageNumber,
                                            BarcodeType = gdPictureImage.Barcode1DReaderGetBarcodeType(i).ToString()
                                        });
                                    }

                                    gdPictureImage.Barcode1DReaderClear();
                                }

                                gdPictureImage.ReleaseGdPictureImage(imageID);
                            }

                            gdPicturePdf.CloseDocument();
                        }
                    }
                }
                else
                {
                    int imageID = gdPictureImage.CreateGdPictureImageFromByteArray(blob);
                    gdPictureImage.TiffOpenMultiPageForWrite(true);

                    if (!gdPictureImage.TiffIsMultiPage(imageID))
                    {
                        int imagetmp = imageID;
                        imageID = gdPictureImage.TiffCreateMultiPageFromGdPictureImage(imagetmp);
                        gdPictureImage.ReleaseGdPictureImage(imagetmp);
                    }

                    if (options.ConvertToBlackAndWhite)
                    {
                        gdPictureImage.FxBlackNWhite(imageID, BitonalReduction.Stucki);
                        gdPictureImage.ConvertTo1BppFast(imageID);
                    }

                    int pageCount = gdPictureImage.TiffGetPageCount(imageID);

                    for (int pageNumber = 1; pageNumber <= pageCount; pageNumber++)
                    {
                        gdPictureImage.TiffSelectPage(imageID, pageNumber);

                        var status = gdPictureImage.Barcode1DReaderDoScan(imageID, Barcode1DReaderScanMode.BestQuality, barcodeTypes, false, 1);
                        if (status == GdPictureStatus.OK)
                        {
                            var barcodeAmount = gdPictureImage.Barcode1DReaderGetBarcodeCount();

                            for (int i = 1; i <= barcodeAmount; i++)
                            {
                                result.Add(new BarcodeRecognitionResult
                                {
                                    Barcode     = gdPictureImage.Barcode1DReaderGetBarcodeValue(i),
                                    Page        = pageNumber,
                                    BarcodeType = gdPictureImage.Barcode1DReaderGetBarcodeType(i).ToString()
                                });
                            }

                            gdPictureImage.Barcode1DReaderClear();
                        }
                    }
                    gdPictureImage.ReleaseGdPictureImage(imageID);
                }
            }

            return(result);
        }