تحسين ملفات PDF في بايثون
قد تحتوي وثيقة PDF أحيانًا على بيانات إضافية. سيساعدك تقليل حجم ملف PDF على تحسين نقل الشبكة والتخزين. هذا مفيد بشكل خاص للنشر على صفحات الويب أو المشاركة على الشبكات الاجتماعية أو الإرسال عبر البريد الإلكتروني أو الأرشفة في التخزين. يمكننا استخدام العديد من التقنيات لتحسين PDF:
استخدم هذه الصفحة عندما تحتاج إلى تقليل حجم PDF للتسليم عبر الويب أو مشاركة البريد الإلكتروني أو توفير التخزين أو الإخراج السهل الطباعة دون إعادة إنشاء المستند من البداية.
- تحسين محتوى الصفحة للتصفح عبر الإنترنت
- تقليص جميع الصور أو ضغطها
- تمكين إعادة استخدام محتوى الصفحة
- دمج التدفقات المكررة
- الخطوط غير المضمّنة
- قم بإزالة الكائنات غير المستخدمة
- إزالة حقول نموذج التسوية
- إزالة التعليقات التوضيحية أو تسويتها
تحسين مستند PDF للويب
يشير التحسين، أو التخطيط الخطي للويب، إلى عملية إنشاء ملف PDF مناسب للتصفح عبر الإنترنت باستخدام متصفح الويب. لتحسين ملف لعرضه على الويب:
يوضح مقتطف الشفرة التالي كيفية تحسين مستند PDF للويب.
import aspose.pdf as ap
from os import path, stat
import sys
def optimize_pdf(infile, outfile):
document = ap.Document(infile)
document.optimize()
document.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
تصغير حجم PDF
ال تحسين الموارد () تسمح لك الطريقة بتقليل حجم المستند عن طريق إزالة المعلومات غير الضرورية. بشكل افتراضي، تعمل هذه الطريقة كما يلي:
- تتم إزالة الموارد غير المستخدمة في صفحات المستند
- يتم ضم الموارد المتساوية إلى كائن واحد
- يتم حذف الكائنات غير المستخدمة
المقتطف أدناه هو مثال. لاحظ، مع ذلك، أن هذه الطريقة لا تضمن تقليص المستند.
import aspose.pdf as ap
from os import path, stat
import sys
def reduce_size_pdf(infile, outfile):
# Open document
document = ap.Document(infile)
# Optimize PDF document. Note, though, that this method cannot guarantee document shrinking
document.optimize_resources()
# Save updated document
document.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
إدارة استراتيجية التحسين
يمكننا أيضًا تخصيص استراتيجية التحسين. حاليًا، فإن تحسين الموارد () تستخدم الطريقة 5 تقنيات. يمكن تطبيق هذه التقنيات باستخدام طريقة OptimizeResources () مع خيارات التحسين المعلمة.
تقليص أو ضغط جميع الصور
لدينا طريقتان للعمل مع الصور: تقليل جودة الصورة و/أو تغيير دقتها. على أي حال، خيارات ضغط الصور يجب تطبيقها. في المثال التالي، نقوم بتقليص الصور عن طريق تقليل ImageEquality إلى 50.
import aspose.pdf as ap
from os import path, stat
import sys
def shrinking_or_compressing_all_images(infile, outfile):
# Open document
document = ap.Document(infile)
# Initialize OptimizationOptions
optimizeOptions = ap.optimization.OptimizationOptions()
# Set CompressImages option
optimizeOptions.image_compression_options.compress_images = True
# Set ImageQuality option
optimizeOptions.image_compression_options.image_quality = 50
# Optimize PDF document using OptimizationOptions
document.optimize_resources(optimizeOptions)
# Save updated document
document.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
إزالة الكائنات غير المستخدمة
تحتوي وثيقة PDF أحيانًا على كائنات PDF التي لم تتم الإشارة إليها من أي كائن آخر في المستند. قد يحدث هذا، على سبيل المثال، عند إزالة صفحة من شجرة صفحة المستند ولكن كائن الصفحة نفسه لا تتم إزالته. لا تؤدي إزالة هذه الكائنات إلى جعل المستند غير صالح بل يؤدي إلى تقليصه.
import aspose.pdf as ap
from os import path, stat
import sys
def removing_unused_objects(infile, outfile):
# Open document
document = ap.Document(infile)
# Set RemoveUnusedObjects option
optimizeOptions = ap.optimization.OptimizationOptions()
optimizeOptions.remove_unused_objects = True
# Optimize PDF document using OptimizationOptions
document.optimize_resources(optimizeOptions)
# Save updated document
document.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
إزالة التدفقات غير المستخدمة
في بعض الأحيان يحتوي المستند على تدفقات الموارد غير المستخدمة. هذه التدفقات ليست «كائنات غير مستخدمة» لأنها تمت الإشارة إليها من قاموس موارد الصفحة. وبالتالي، لا تتم إزالتها باستخدام طريقة «إزالة الكائنات غير المستخدمة». ولكن لا يتم استخدام هذه التدفقات أبدًا مع محتويات الصفحة. قد يحدث هذا في الحالات التي تتم فيها إزالة صورة من الصفحة ولكن ليس من موارد الصفحة. أيضًا، يحدث هذا الموقف غالبًا عندما يتم استخراج الصفحات من المستند وتحتوي صفحات المستند على موارد «مشتركة»، أي نفس كائن الموارد. يتم تحليل محتويات الصفحة لتحديد ما إذا كان تدفق الموارد مستخدمًا أم لا. تتم إزالة التدفقات غير المستخدمة. في بعض الأحيان يقلل حجم المستند. استخدام هذه التقنية مشابه للخطوة السابقة:
import aspose.pdf as ap
from os import path, stat
import sys
def removing_unused_streams(infile, outfile):
# Open document
document = ap.Document(infile)
# Set RemoveUnusedStreams option
optimizeOptions = ap.optimization.OptimizationOptions()
optimizeOptions.remove_unused_streams = True
# Optimize PDF document using OptimizationOptions
document.optimize_resources(optimizeOptions)
# Save updated document
document.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
ربط التدفقات المكررة
يمكن أن تحتوي بعض المستندات على العديد من تدفقات الموارد المتطابقة (مثل الصور، على سبيل المثال). قد يحدث هذا، على سبيل المثال عندما يكون المستند متسلسلًا مع نفسه. يحتوي مستند الإخراج على نسختين مستقلتين من نفس تدفق الموارد. نحن نحلل جميع تدفقات الموارد ونقارنها. في حالة تكرار التدفقات، يتم دمجها، أي تبقى نسخة واحدة فقط. يتم تغيير المراجع بشكل مناسب، وتتم إزالة نسخ الكائن. في بعض الحالات، يساعد ذلك على تقليل حجم المستند.
import aspose.pdf as ap
from os import path, stat
import sys
def linking_duplicate_streams(infile, outfile):
# Open document
document = ap.Document(infile)
# Set link_duplicate_streams option
optimizeOptions = ap.optimization.OptimizationOptions()
optimizeOptions.link_duplicate_streams = True
# Optimize PDF document using OptimizationOptions
document.optimize_resources(optimizeOptions)
# Save updated document
document.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
إلغاء تضمين الخطوط
إذا كان المستند يستخدم خطوطًا مضمنة، فهذا يعني أن جميع بيانات الخط مخزنة في المستند. الميزة هي أن المستند قابل للعرض بغض النظر عما إذا كان الخط مثبتًا على جهاز المستخدم أم لا. لكن تضمين الخطوط يجعل المستند أكبر. تقوم طريقة إلغاء تضمين الخطوط بإزالة جميع الخطوط المضمنة. وبالتالي، يقل حجم المستند ولكن المستند نفسه قد يصبح غير قابل للقراءة إذا لم يتم تثبيت الخط الصحيح.
import aspose.pdf as ap
from os import path, stat
import sys
def unembed_fonts(infile, outfile):
# Open document
document = ap.Document(infile)
# Set unembed_fonts option
optimize_options = ap.optimization.OptimizationOptions()
optimize_options.unembed_fonts = True
# Optimize PDF document using OptimizationOptions
document.optimize_resources(optimize_options)
# Save updated document
document.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
تقوم موارد التحسين بتطبيق هذه الأساليب على المستند. في حالة تطبيق أي من هذه الطرق، سينخفض حجم المستند على الأرجح. إذا لم يتم تطبيق أي من هذه الطرق، فلن يتغير حجم المستند وهو أمر واضح.
طرق إضافية لتقليل حجم مستند PDF
إزالة التعليقات التوضيحية أو تسويتها
يمكن حذف التعليقات التوضيحية عندما تكون غير ضرورية. عند الحاجة إليها ولكن لا تتطلب تحريرًا إضافيًا، يمكن تسويتها. ستؤدي كلتا الطريقتين إلى تقليل حجم الملف.
import aspose.pdf as ap
from os import path, stat
import sys
def flatten_annotations(infile, outfile):
# Open document
document = ap.Document(infile)
# Flatten annotations
for page in document.pages:
for annotation in page.annotations:
annotation.flatten()
# Save updated document
document.save(outfile)
إزالة حقول النموذج
إذا كانت وثيقة PDF تحتوي على AcroForms، فيمكننا محاولة تقليل حجم الملف عن طريق تسوية حقول النموذج.
import aspose.pdf as ap
from os import path, stat
import sys
def flatten_forms(infile, outfile):
# Load source PDF form
doc = ap.Document(infile)
# Flatten Forms
if len(doc.form.fields) > 0:
for item in doc.form.fields:
item.flatten()
# Save the updated document
doc.save(outfile)
file_stats_1 = stat(infile)
file_stats_2 = stat(outfile)
print(
"Original file size: {}. Reduced file size: {}".format(
file_stats_1.st_size, file_stats_2.st_size
)
)
قم بتحويل ملف PDF من مساحة ألوان RGB إلى درجات الرمادي
يتكون ملف PDF من النص والصورة والمرفقات والتعليقات التوضيحية والرسوم البيانية والكائنات الأخرى. قد تواجه مطلبًا لتحويل ملف PDF من مساحة ألوان RGB إلى درجات الرمادي بحيث يكون أسرع أثناء طباعة ملفات PDF هذه. أيضًا، عندما يتم تحويل الملف إلى درجات الرمادي، يتم تقليل حجم المستند أيضًا، ولكن يمكن أن يتسبب ذلك أيضًا في انخفاض جودة المستند. هذه الميزة مدعومة حاليًا من خلال ميزة Pre-Flight في Adobe Acrobat، ولكن عند الحديث عن التشغيل الآلي للمكتب، يعد Aspose.PDF حلاً نهائيًا لتوفير مثل هذه الروافع لمعالجة المستندات. من أجل تحقيق هذا المطلب، يمكن استخدام مقتطف الشفرة التالي.
import aspose.pdf as ap
from os import path, stat
import sys
def сonvert_PDF_from_RGB_colorspace_to_grayscale(infile, outfile):
document = ap.Document(infile)
strategy = ap.RgbToDeviceGrayConversionStrategy()
for page in document.pages:
# Convert the RGB colorspace image to GrayScale colorspace
strategy.convert(page)
# Save resultant file
document.save(outfile)
ضغط فك الشفرة المسطح
يوفر Aspose.PDF لبيثون عبر .NET دعمًا لضغط FlateDecode لوظيفة تحسين PDF. يوضح مقتطف الشفرة التالي أدناه كيفية استخدام الخيار في التحسين لتخزين الصور باستخدام ضغط FlateDecode:
import aspose.pdf as ap
from os import path, stat
import sys
def using_flatedecode_compression(infile, outfile):
# Open Document
doc = ap.Document(infile)
# Initialize OptimizationOptions
optimizationOptions = ap.optimization.OptimizationOptions()
# To optimise image using FlateDecode Compression set optimization options to Flate
optimizationOptions.image_compression_options.encoding = (
ap.optimization.ImageEncoding.FLATE
)
# Set Optimization Options
doc.optimize_resources(optimizationOptions)
# Save Document
doc.save(outfile)