إنشاء صور مصغرة من PDF

تطوير تطبيق باستخدام واجهة برمجة التطبيقات للاتصال بين التطبيقات في Acrobat

فكر في واجهة برمجة التطبيقات الخاصة بـ Acrobat على أنها تحتوي على طبقتين متميزتين تستخدمان كائنات الاتصال بين التطبيقات (IAC):

  • طبقة تطبيق Acrobat (AV). تتيح لك طبقة AV التحكم في كيفية عرض المستند. على سبيل المثال، يتم عرض كائن المستند في الطبقة المرتبطة بـ Acrobat.
  • طبقة المستند القابل للنقل (PD). توفر طبقة PD الوصول إلى المعلومات داخل المستند، مثل صفحة. من طبقة PD يمكنك إجراء عمليات أساسية على مستندات PDF، مثل حذف أو نقل أو استبدال الصفحات، بالإضافة إلى تغيير خصائص التعليقات. يمكنك أيضًا طباعة صفحات PDF، وتحديد النص، والوصول إلى النص المعالج، وإنشاء أو حذف الصور المصغرة.

نظرًا لأن هدفنا هو تحويل صفحات PDF إلى صور مصغرة، فإننا نركز أكثر على IAC. تحتوي واجهة برمجة التطبيقات IAC على كائنات مثل PDDoc وPDPage وPDAnnot وغيرها، مما يمكّن المستخدم من التعامل مع طبقة المستند القابل للنقل (PD). يقوم نموذج الكود التالي بمسح مجلد وتحويل صفحات PDF إلى صور مصغرة. باستخدام مجموعة أدوات Acrobat SDK، يمكننا أيضًا قراءة بيانات التعريف الخاصة بـ PDF واسترداد عدد الصفحات في المستند.

نهج Acrobat

من أجل إنشاء الصور المصغرة لكل مستند، استخدمنا مجموعة أدوات Adobe Acrobat 7.0 وMicrosoft .NET 2.0 Framework.

تجمع مجموعة أدوات Acrobat مع النسخة الكاملة من Adobe Acrobat مكتبة COM من الكائنات (للأسف، لا تكشف Adobe Reader المجانية عن واجهات COM) التي يمكن استخدامها للتلاعب والوصول إلى معلومات PDF. باستخدام هذه الكائنات COM عبر COM Interop، قم بتحميل مستند PDF، واحصل على الصفحة الأولى وقم بعرض تلك الصفحة على الحافظة. ثم، باستخدام .NET Framework، انسخ هذا إلى صورة نقطية، وقم بتغيير حجم الصورة ودمجها واحفظ النتيجة كملف GIF أو PNG.

بمجرد تثبيت Adobe Acrobat، استخدم regedit.exe وابحث تحت HKEY_CLASSES_ROOT عن إدخال يسمى AcroExch.PDDoc.

السجل يظهر إدخال AcroExch.PDDDoc

todo:image_alt_text

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void GenerateThumbnailImagesFromPDF()
{
    // Acrobat objects
    Acrobat.CAcroPDDoc pdfDoc;
    Acrobat.CAcroPDPage pdfPage;
    Acrobat.CAcroRect pdfRect;
    Acrobat.CAcroPoint pdfPoint;

    AppSettingsReader appSettings = new AppSettingsReader();
    string pdfInputPath = appSettings.GetValue("pdfInputPath", typeof(string)).ToString();
    string pngOutputPath = appSettings.GetValue("pngOutputPath", typeof(string)).ToString();
    string templatePortraitFile = Application.StartupPath + @"\pdftemplate_portrait.gif";
    string templateLandscapeFile = Application.StartupPath + @"\pdftemplate_landscape.gif";

    // Get list of files to process from the input path
    string[] files = Directory.GetFiles(pdfInputPath, "*.pdf");

    for (int n = 0; n < files.Length; n++)
    {
        string inputFile = files[n];
        string outputFile = Path.Combine(pngOutputPath, Path.GetFileNameWithoutExtension(inputFile) + ".png");

        // Create PDF document
        pdfDoc = (Acrobat.CAcroPDDoc)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", "");

        if (pdfDoc.Open(inputFile) == 0)
        {
            throw new FileNotFoundException($"Unable to open PDF file: {inputFile}");
        }

        int pageCount = pdfDoc.GetNumPages();
        pdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(0);
        pdfPoint = (Acrobat.CAcroPoint)pdfPage.GetSize();

        pdfRect = (Acrobat.CAcroRect)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.Rect", "");
        pdfRect.Left = 0;
        pdfRect.right = pdfPoint.x;
        pdfRect.Top = 0;
        pdfRect.bottom = pdfPoint.y;

        pdfPage.CopyToClipboard(pdfRect, 0, 0, 100);
        IDataObject clipboardData = Clipboard.GetDataObject();

        if (clipboardData.GetDataPresent(DataFormats.Bitmap))
        {
            Bitmap pdfBitmap = (Bitmap)clipboardData.GetData(DataFormats.Bitmap);

            int thumbnailWidth = 45;
            int thumbnailHeight = 59;
            string templateFile = pdfPoint.x < pdfPoint.y ? templatePortraitFile : templateLandscapeFile;

            if (pdfPoint.x > pdfPoint.y)
            {
                // Swap width and height for landscape orientation
                (thumbnailWidth, thumbnailHeight) = (thumbnailHeight, thumbnailWidth);
            }

            Bitmap templateBitmap = new Bitmap(templateFile);
            Image pdfImage = pdfBitmap.GetThumbnailImage(thumbnailWidth, thumbnailHeight, null, IntPtr.Zero);

            Bitmap thumbnailBitmap = new Bitmap(thumbnailWidth + 7, thumbnailHeight + 7, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            templateBitmap.MakeTransparent();

            using (Graphics thumbnailGraphics = Graphics.FromImage(thumbnailBitmap))
            {
                thumbnailGraphics.DrawImage(pdfImage, 2, 2, thumbnailWidth, thumbnailHeight);
                thumbnailGraphics.DrawImage(templateBitmap, 0, 0);
                thumbnailBitmap.Save(outputFile, System.Drawing.Imaging.ImageFormat.Png);
            }

            Console.WriteLine("Generated thumbnail: {0}", outputFile);

            pdfDoc.Close();
            Marshal.ReleaseComObject(pdfPage);
            Marshal.ReleaseComObject(pdfRect);
            Marshal.ReleaseComObject(pdfDoc);
        }
    }
}

نهج Aspose.PDF for .NET

توفر Aspose.PDF for .NET دعمًا واسعًا للتعامل مع مستندات PDF. كما تدعم القدرة على تحويل صفحات مستندات PDF إلى مجموعة متنوعة من تنسيقات الصور. يمكن تحقيق الوظيفة الموضحة أعلاه بسهولة باستخدام Aspose.PDF for .NET.

تتمتع Aspose.PDF بمزايا مميزة:

  • لا تحتاج إلى تثبيت Adobe Acrobat على نظامك للعمل مع ملفات PDF.
  • استخدام Aspose.PDF for .NET بسيط وسهل الفهم مقارنةً بأتمتة Acrobat.

إذا كنا بحاجة إلى تحويل صفحات PDF إلى JPEGs، فإن مساحة أسماء Aspose.PDF.Devices توفر فئة تسمى JpegDevice لعرض صفحات PDF كصور JPEG. يرجى إلقاء نظرة على نموذج الكود التالي.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void GenerateThumbnailImagesFromPDF()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_Images();

    // Retrieve names of all the PDF files in a particular directory
    string[] fileEntries = Directory.GetFiles(dataDir, "*.pdf");

    // Iterate through all the files entries in array
    for (int counter = 0; counter < fileEntries.Length; counter++)
    {
        // Open PDF document
        using (var document = new Aspose.Pdf.Document(fileEntries[counter]))
        {
            for (int pageCount = 1; pageCount <= document.Pages.Count; pageCount++)
            {
                using (FileStream imageStream = new FileStream(dataDir + @"\Thumbanils" + counter.ToString() + "_" + pageCount + ".jpg", FileMode.Create))
                {
                    var resolution = new Aspose.Pdf.Devices.Resolution(300);
                    var jpegDevice = new Aspose.Pdf.Devices.JpegDevice(45, 59, resolution, 100);
                    // Convert a particular page and save the image to stream
                    jpegDevice.Process(document.Pages[pageCount], imageStream);
                }
            }
        }
    }
}