تحسين أو ضغط أو تقليل حجم ملف PDF في C#
قد يحتوي مستند PDF أحيانًا على بيانات إضافية. تقليل حجم ملف PDF سيساعدك على تحسين نقل الشبكة والتخزين. هذا مفيد بشكل خاص للنشر على صفحات الويب، المشاركة على شبكات التواصل الاجتماعي، الإرسال عبر البريد الإلكتروني، أو الأرشفة في التخزين. يمكننا استخدام عدة تقنيات لتحسين PDF:
- تحسين محتوى الصفحة للتصفح عبر الإنترنت
- تقليص أو ضغط جميع الصور
- تمكين إعادة استخدام محتوى الصفحة
- دمج التدفقات المكررة
- إلغاء تضمين الخطوط
- إزالة الكائنات غير المستخدمة
- إزالة تسطيح حقول النماذج
- إزالة أو تسطيح التعليقات التوضيحية
تحسين مستند PDF للويب
التحسين، أو التخطيط المباشر للويب، يشير إلى عملية جعل ملف PDF مناسبًا للتصفح عبر الإنترنت باستخدام متصفح ويب. لتحسين ملف لعرض الويب:
الشفرة التالية تعمل أيضًا مع مكتبة Aspose.PDF.Drawing.
الشفرة التالية توضح كيفية تحسين مستند PDF للويب.
// للأمثلة الكاملة وملفات البيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// المسار إلى مجلد المستندات.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح المستند
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// تحسين للويب
pdfDocument.Optimize();
dataDir = dataDir + "OptimizeDocument_out.pdf";
// حفظ المستند الناتج
pdfDocument.Save(dataDir);
تقليل حجم PDF
طريقة OptimizeResources() تتيح لك تقليل حجم المستند بإزالة المعلومات غير الضرورية. OptimizeResources() تسمح لك بتقليل حجم المستند عن طريق إزالة المعلومات غير الضرورية.
- يتم إزالة الموارد التي لا تُستخدم في صفحات المستند
- يتم دمج الموارد المتماثلة في كائن واحد
- يتم حذف الكائنات غير المستخدمة
الشفرة أدناه هي مثال. لاحظ، على الرغم من ذلك، أن هذه الطريقة لا يمكن أن تضمن تقليص حجم المستند.
// للحصول على أمثلة كاملة وملفات بيانات، يرجى الذهاب إلى https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// مسار إلى دليل المستندات.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح مستند
Document pdfDocument = new Document(dataDir + "ShrinkDocument.pdf");
// تحسين مستند PDF. لاحظ، على الرغم من ذلك، أن هذه الطريقة لا يمكن أن تضمن تقليص حجم المستند
pdfDocument.OptimizeResources();
dataDir = dataDir + "ShrinkDocument_out.pdf";
// حفظ المستند المحدث
pdfDocument.Save(dataDir);
إدارة استراتيجية التحسين
يمكننا أيضًا تخصيص استراتيجية التحسين. يمكننا أيضًا تخصيص استراتيجية التحسين.
تقليص أو ضغط جميع الصور
لدينا طريقتان للتعامل مع الصور: تقليل جودة الصورة و/أو تغيير دقتها. في كلتا الحالتين، يجب تطبيق خيارات ضغط الصور. في المثال التالي، نقوم بتصغير الصور عن طريق خفض جودة الصورة إلى 50.
جودة الصورة
تعمل بطريقة مشابهة لجودة JPEG، حيث أن القيمة 0 هي الأدنى والقيمة 100 هي الأعلى.
// للحصول على أمثلة كاملة وملفات بيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// مسار دليل الوثائق.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// فتح المستند
Document pdfDocument = new Document(dataDir + "Shrinkimage.pdf");
// تهيئة خيارات التحسين
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// تعيين خيار ضغط الصور
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// تعيين خيار جودة الصورة
optimizeOptions.ImageCompressionOptions.ImageQuality = 50;
// تحسين مستند PDF باستخدام خيارات التحسين
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "Shrinkimage_out.pdf";
// حفظ المستند المحدث
pdfDocument.Save(dataDir);
طريقة أخرى هي تغيير حجم الصور بدقة أقل. في هذه الحالة، يجب تعيين ResizeImages إلى true وMaxResolution إلى القيمة المناسبة.
// للحصول على أمثلة كاملة وملفات البيانات، يرجى الذهاب إلى https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// تهيئة الوقت
var time = DateTime.Now.Ticks;
// مسار إلى مجلد الوثائق
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// فتح المستند
Document pdfDocument = new Document(dataDir + "ResizeImage.pdf");
// تهيئة خيارات التحسين
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// تعيين خيار CompressImages
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// تعيين خيار ImageQuality
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// تعيين خيار ResizeImage
optimizeOptions.ImageCompressionOptions.ResizeImages = true;
// تعيين خيار MaxResolution
optimizeOptions.ImageCompressionOptions.MaxResolution = 300;
// تحسين مستند PDF باستخدام OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "ResizeImages_out.pdf";
// حفظ المستند المحدث
pdfDocument.Save(dataDir);
مسألة مهمة أخرى هي وقت التنفيذ. لكن مرة أخرى، يمكننا إدارة هذا الإعداد أيضًا. حاليًا، يمكننا استخدام خوارزميتين - القياسية والسريعة. للتحكم في وقت التنفيذ يجب علينا تعيين خاصية الإصدار. يوضح الجزء التالي خوارزمية السريع:
// للحصول على أمثلة كاملة وملفات بيانات، يرجى الذهاب إلى https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// تهيئة الوقت
var time = DateTime.Now.Ticks;
// المسار إلى دليل الوثائق.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// فتح المستند
Document pdfDocument = new Document(dataDir + "Shrinkimage.pdf");
// تهيئة خيارات التحسين
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// تعيين خيار ضغط الصور
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// تعيين خيار جودة الصورة
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// تعيين إصدار ضغط الصورة إلى سريع
optimizeOptions.ImageCompressionOptions.Version = Pdf.Optimization.ImageCompressionVersion.Fast;
// تحسين مستند PDF باستخدام خيارات التحسين
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "FastShrinkImages_out.pdf";
// حفظ المستند المحدث
pdfDocument.Save(dataDir);
Console.WriteLine("العلامات: {0}", DateTime.Now.Ticks - time);
إزالة الكائنات غير المستخدمة
قد يحتوي مستند PDF أحيانًا على كائنات PDF التي لا يشير إليها أي كائن آخر في المستند. قد يحدث هذا، على سبيل المثال، عندما يتم إزالة صفحة من شجرة صفحات المستند ولكن لا يتم إزالة كائن الصفحة نفسه. إزالة هذه الكائنات لا تجعل المستند غير صالح ولكنها تقلل من حجمه.
// لأمثلة كاملة وملفات البيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// المسار إلى دليل المستندات.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح المستند
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// تعيين خيار RemoveUsedObject
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
RemoveUnusedObjects = true
};
// تحسين مستند PDF باستخدام OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// حفظ المستند المحدث
pdfDocument.Save(dataDir);
إزالة التدفقات غير المستخدمة
أحيانًا يحتوي المستند على تدفقات موارد غير مستخدمة. أحيانًا يحتوي المستند على تدفقات موارد غير مستخدمة.
// للحصول على أمثلة كاملة وملفات بيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// المسار إلى دليل المستندات.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح المستند
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// تعيين خيار إزالة التدفقات غير المستخدمة
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
RemoveUnusedStreams = true
};
// تحسين مستند PDF باستخدام OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// حفظ المستند المحدث
pdfDocument.Save(dataDir);
ربط تدفقات الموارد المكررة
قد يحتوي بعض المستندات على عدة تدفقات موارد متطابقة (مثل الصور، على سبيل المثال). بعض الوثائق قد تحتوي على عدة تدفقات موارد متطابقة (مثل الصور، على سبيل المثال).
// للحصول على أمثلة كاملة وملفات البيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// المسار إلى دليل الوثائق.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح الوثيقة
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// تعيين خيار LinkDuplcateStreams
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
LinkDuplcateStreams = true
};
// تحسين وثيقة PDF باستخدام OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// حفظ الوثيقة المحدثة
pdfDocument.Save(dataDir);
بالإضافة إلى ذلك، يمكننا استخدام إعدادات AllowReusePageContent. بالإضافة إلى ذلك، يمكننا استخدام إعدادات AllowReusePageContent.
// للحصول على أمثلة كاملة وملفات البيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// المسار إلى دليل المستندات.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح المستند
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// تعيين خيار AllowReusePageContent
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
AllowReusePageContent = true
};
Console.WriteLine("البدء");
// تحسين مستند PDF باستخدام OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
// حفظ المستند المحدث
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("الانتهاء");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("حجم الملف الأصلي: {0}. حجم الملف المخفض: {1}", fi1.Length, fi2.Length);
إزالة تضمين الخطوط
إذا كان المستند يستخدم خطوطًا مضمنة، فهذا يعني أن جميع بيانات الخط مخزنة في المستند. الفائدة هي أن المستند يمكن مشاهدته بغض النظر عن ما إذا كان الخط مثبتًا على جهاز المستخدم أم لا. لكن تضمين الخطوط يجعل المستند أكبر حجمًا. تقوم طريقة إزالة تضمين الخطوط بإزالة جميع الخطوط المضمنة. وبذلك، يقل حجم المستند لكن المستند ذاته قد يصبح غير قابل للقراءة إذا لم يكن الخط الصحيح مثبتًا.
// للحصول على الأمثلة الكاملة وملفات البيانات، يرجى الذهاب إلى https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// المسار إلى دليل المستندات.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح المستند
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// تعيين خيار UnembedFonts
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
UnembedFonts = true
};
Console.WriteLine("Start");
// تحسين مستند PDF باستخدام OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
// حفظ المستند المحدث
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Finished");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Original file size: {0}. Reduced file size: {1}", fi1.Length, fi2.Length);
طرق إضافية لتقليل حجم مستند PDF
إزالة أو تسطيح التعليقات التوضيحية
يمكن حذف التعليقات التوضيحية عندما لا تكون ضرورية. عندما تكون ضرورية ولا تتطلب تحريرًا إضافيًا، يمكن تسطيحها. كلا هذه الأساليب سيقلل من حجم الملف.
// لأمثلة كاملة وملفات بيانات، يرجى الذهاب إلى https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// مسار إلى دليل الوثائق.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// فتح المستند
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// تسطيح التعليقات التوضيحية
foreach (var page in pdfDocument.Pages)
{
foreach (var annotation in page.Annotations)
{
annotation.Flatten();
}
}
// حفظ المستند المحدث
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
إزالة حقول النموذج
إذا احتوى مستند PDF على AcroForms، يمكننا محاولة تقليل حجم الملف عن طريق تسطيح حقول النموذج.
// للحصول على الأمثلة الكاملة وملفات البيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// مسار إلى دليل المستندات.
string dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// تحميل نموذج PDF المصدر
Document doc = new Document(dataDir + "input.pdf");
// تسطيح النماذج
if (doc.Form.Fields.Count() > 0)
{
foreach (var item in doc.Form.Fields)
{
item.Flatten();
}
}
dataDir = dataDir + "FlattenForms_out.pdf";
// حفظ المستند المحدث
doc.Save(dataDir);
تحويل PDF من فضاء الألوان RGB إلى الرمادي
يتكون ملف PDF من نص، صورة، مرفق، تعليقات، رسوم بيانية، وغيرها من الكائنات. ملف PDF يتضمن نصوص، صور، مرفقات، تعليقات، رسومات، وغيرها من العناصر.
// للحصول على أمثلة كاملة وملفات البيانات، يرجى زيارة https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// المسار إلى مجلد الوثائق.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// تحميل ملف PDF المصدر
using (Document document = new Document(dataDir + "input.pdf"))
{
Aspose.Pdf.RgbToDeviceGrayConversionStrategy strategy = new Aspose.Pdf.RgbToDeviceGrayConversionStrategy();
for (int idxPage = 1; idxPage <= document.Pages.Count; idxPage++)
{
// الحصول على نسخة من صفحة معينة داخل PDF
Page page = document.Pages[idxPage];
// تحويل صور مساحة الألوان RGB إلى مساحة ألوان الرمادي
strategy.Convert(page);
}
// حفظ الملف الناتج
document.Save(dataDir + "Test-gray_out.pdf");
}
ضغط FlateDecode
يوفر Aspose.PDF لـ .NET دعم ضغط FlateDecode لوظائف تحسين PDF. Aspose.PDF لـ .NET يدعم ضغط FlateDecode لوظيفة تحسين PDF.
تخزين الصورة في XImageCollection
Aspose.PDF لـ .NET يوفر القدرة على تخزين صور جديدة في XImageCollection مع ضغط FlateDecode. لتفعيل هذا الخيار يمكنك استخدام علم ImageFilterType.Flate. يوضح الجزء التالي من الكود كيفية استخدام هذه الوظيفة: