Optimize PDF menggunakan C++
Pertama-tama, setiap optimasi PDF yang Anda lakukan adalah untuk pengguna. Dalam PDF, optimasi pengguna sebagian besar tentang mengurangi ukuran PDF Anda untuk meningkatkan kecepatan pemuatannya. Ini adalah tugas yang paling populer. Kita dapat menggunakan beberapa teknik untuk mengoptimalkan PDF, tetapi yang paling esensial:
- Optimalkan konten halaman untuk penjelajahan online
- Perkecil atau kompres semua gambar
- Aktifkan penggunaan ulang konten halaman
- Gabungkan aliran duplikat
- Hapus penyematan font
- Hapus objek yang tidak digunakan
- Hapus bidang formulir rata
- Hapus atau ratakan anotasi
Optimalkan Dokumen PDF untuk Web
Ketika Anda dihadapkan dengan tugas mengoptimalkan konten dokumen PDF Anda untuk peringkat yang lebih baik di mesin pencari, Aspose.PDF untuk C++ memiliki solusi.
- Buka dokumen input dalam objek Document.
- Gunakan metode Optimize.
- Simpan dokumen yang telah dioptimalkan menggunakan metode Save.
Cuplikan kode berikut menunjukkan cara mengoptimalkan dokumen PDF untuk web.
using namespace System;
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Text;
//Optimalkan Dokumen PDF untuk Web
void OptimizeForWeb() {
// String untuk nama path
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String outfilename("OptimizeDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>();
// Lakukan beberapa operasi (tambah halaman, gambar, dll)
// ...
// Optimalkan untuk web
document->Optimize();
// Simpan dokumen keluaran
document->Save(_dataDir + outfilename);
}
Kurangi Ukuran PDF
Metode OptimizeResources() memungkinkan Anda untuk mengurangi ukuran dokumen dengan menghapus informasi yang tidak diperlukan. Secara default, metode ini bekerja sebagai berikut:
- Sumber daya yang tidak digunakan pada halaman dokumen dihapus
- Sumber daya yang sama digabungkan menjadi satu objek
- Objek yang tidak digunakan dihapus
Cuplikan di bawah ini adalah contoh. Namun, perlu dicatat bahwa metode ini tidak dapat menjamin penyusutan dokumen.
void ReduceSizePDF() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String outfilename("ShrinkDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>();
// Lakukan beberapa operasi (tambahkan halaman, gambar, dll)
// ...
// Optimalkan dokumen PDF. Namun, perlu dicatat bahwa metode ini tidak dapat menjamin penyusutan dokumen
document->OptimizeResources();
// Simpan dokumen keluaran
document->Save(_dataDir + outfilename);
}
Manajemen Strategi Optimalisasi
Kita juga dapat menyesuaikan strategi optimalisasi. Saat ini, metode OptimizeResources() menggunakan 5 teknik. Teknik-teknik ini dapat diterapkan menggunakan metode OptimizeResources() dengan parameter OptimizationOptions.
Mengecilkan atau Mengompresi Semua Gambar
Untuk mengoptimalkan gambar dalam dokumen PDF Anda, kami akan menggunakan Aspose.Pdf.Optimization. Untuk menyelesaikan masalah dengan optimasi gambar, kami memiliki opsi berikut: mengurangi kualitas gambar dan/atau mengubah resolusi mereka. Dalam hal apapun, ImageCompressionOptions harus diterapkan. Dalam contoh berikut, kami mengecilkan gambar dengan mengurangi ImageQuality menjadi 50.
void CompressImage() {
// String untuk nama path
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ShrinkDocument.pdf");
String outfilename("ShrinkDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Setel opsi CompressImages
optimizationOptions->get_ImageCompressionOptions()->set_CompressImages(true);
// Setel opsi ImageQuality
optimizationOptions->get_ImageCompressionOptions()->set_ImageQuality(50);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Untuk mengatur gambar pada resolusi lebih rendah, atur ResizeImages ke true dan MaxResolution ke nilai yang sesuai.
void ResizeImagesWithLowerResolution() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ResizeImage.pdf");
String outfilename("ResizeImages_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Atur opsi CompressImages
optimizationOptions->get_ImageCompressionOptions()->set_CompressImages(true);
// Atur opsi ImageQuality
optimizationOptions->get_ImageCompressionOptions()->set_ImageQuality(75);
// Atur opsi ResizeImage
optimizationOptions->get_ImageCompressionOptions()->set_ResizeImages(true);
// Atur opsi MaxResolution
optimizationOptions->get_ImageCompressionOptions()->set_MaxResolution(300);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang telah diperbarui
document->Save(_dataDir + outfilename);
}
Aspose.PDF untuk C++ juga menawarkan Anda kontrol atas pengaturan runtime. Saat ini, kita dapat menggunakan dua algoritma - Standar dan Cepat. Untuk mengontrol waktu eksekusi kita harus mengatur properti Version.
Cuplikan berikut menunjukkan algoritma Cepat:
void ResizeImagesWithLowerResolutionFast() {
auto time = System::DateTime::get_Now().get_Ticks();
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ResizeImage.pdf");
String outfilename("ResizeImages_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Atur opsi CompressImages
optimizationOptions->get_ImageCompressionOptions()->set_CompressImages(true);
// Atur opsi ImageQuality
optimizationOptions->get_ImageCompressionOptions()->set_ImageQuality(75);
// Atur opsi ResizeImage
optimizationOptions->get_ImageCompressionOptions()->set_ResizeImages(true);
// Atur Versi Kompresi Gambar menjadi cepat
optimizationOptions->get_ImageCompressionOptions()->set_Version (Aspose::Pdf::Optimization::ImageCompressionVersion::Fast);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang telah diperbarui
document->Save(_dataDir + outfilename);
std::cout << "Ticks: " << System::DateTime::get_Now().get_Ticks() - time << std::endl;
}
Menghapus Objek yang Tidak Digunakan
Terkadang Anda mungkin perlu menghapus beberapa objek yang tidak digunakan dari dokumen PDF Anda yang tidak direferensikan pada halaman. Ini mungkin terjadi, misalnya, ketika sebuah halaman dihapus dari pohon halaman dokumen tetapi objek halaman itu sendiri tidak dihapus. Menghapus objek-objek ini tidak membuat dokumen menjadi tidak valid tetapi justru memperkecilnya. Periksa cuplikan kode berikut:
void RemovingUnusedObject() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ShrinkDocument.pdf");
String outfilename("ShrinkDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Atur opsi RemoveUsedObject
optimizationOptions->set_RemoveUnusedObjects(true);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Menghapus Stream yang Tidak Digunakan
Terkadang dokumen berisi stream sumber daya yang tidak digunakan. Stream ini bukan “objek yang tidak digunakan” karena mereka direferensikan dari kamus sumber daya halaman. Oleh karena itu, mereka tidak dihapus dengan metode “menghapus objek yang tidak digunakan”. Namun, stream ini tidak pernah digunakan dengan konten halaman. Hal ini dapat terjadi dalam kasus ketika sebuah gambar telah dihapus dari halaman tetapi tidak dari sumber daya halaman. Juga, situasi ini sering terjadi ketika halaman-halaman diekstraksi dari dokumen dan halaman-halaman dokumen memiliki sumber daya “umum”, yaitu, objek Sumber Daya yang sama. Konten halaman dianalisis untuk menentukan apakah stream sumber daya digunakan atau tidak. Stream yang tidak digunakan dihapus. Terkadang ini mengurangi ukuran dokumen. Penggunaan teknik ini mirip dengan langkah sebelumnya:
void RemovingUnusedStreams() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ShrinkDocument.pdf");
String outfilename("ShrinkDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>();
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Setel opsi RemoveUsedStreams
optimizationOptions->set_RemoveUnusedStreams(true);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Menautkan Stream Duplikat
Beberapa dokumen dapat berisi beberapa stream sumber daya duplikat (seperti gambar, misalnya). Ini dapat terjadi, misalnya ketika sebuah dokumen digabung dengan dirinya sendiri. Dokumen keluaran berisi dua salinan independen dari stream sumber daya yang sama. Kami menganalisis semua stream sumber daya dan membandingkannya. Jika stream terduplikasi, mereka digabungkan, yaitu hanya satu salinan yang tersisa. Referensi diubah dengan tepat, dan salinan objek dihapus. Dalam beberapa kasus, ini membantu mengurangi ukuran dokumen.
void LinkingDuplicateStreams() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ShrinkDocument.pdf");
String outfilename("ShrinkDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Setel opsi LinkDuplcateStreams
optimizationOptions->set_LinkDuplcateStreams(true);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Selain itu, kita dapat menggunakan pengaturan AllowReusePageContent. Jika properti ini diatur ke true, konten halaman akan digunakan kembali saat mengoptimalkan dokumen untuk halaman yang identik.
void AllowReusePageContent() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ShrinkDocument.pdf");
String outfilename("ShrinkDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Atur opsi AllowReusePageContent
optimizationOptions->set_AllowReusePageContent(true);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang telah diperbarui
document->Save(_dataDir + outfilename);
}
Melepas Sematan Font
Ketika Anda membuat versi PDF dari file desain pribadi Anda, salinan semua font yang diperlukan ditambahkan ke file PDF itu sendiri. Ini adalah penyematan. Terlepas dari di mana PDF ini dibuka, apakah itu di komputer Anda, komputer teman Anda, atau komputer penyedia cetak Anda, semua font yang benar akan ada dan akan ditampilkan dengan benar.
Namun, jika dokumen menggunakan font yang disematkan, itu berarti semua data font disimpan dalam dokumen. Keuntungannya adalah dokumen dapat dilihat terlepas dari apakah font diinstal pada mesin pengguna atau tidak. Tetapi penyematan font membuat dokumen menjadi lebih besar. Metode melepas sematan font menghapus semua font yang disematkan. Dengan demikian, ukuran dokumen berkurang tetapi dokumen itu sendiri mungkin menjadi tidak dapat dibaca jika font yang benar tidak diinstal.
void UnembedFonts() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("ShrinkDocument.pdf");
String outfilename("ShrinkDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir+infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Atur opsi AllowReusePageContent
optimizationOptions->set_UnembedFonts(true);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Sumber daya optimasi menerapkan metode-metode ini pada dokumen. Jika salah satu dari metode ini diterapkan, ukuran dokumen kemungkinan besar akan berkurang. Jika tidak ada metode ini yang diterapkan, ukuran dokumen tidak akan berubah, yang jelas.
Cara Tambahan untuk Mengurangi Ukuran Dokumen PDF
Menghapus atau Meratakan Anotasi
Kehadiran anotasi dalam dokumen PDF Anda secara alami meningkatkan ukurannya. Anotasi dapat dihapus ketika tidak diperlukan. Ketika diperlukan tetapi tidak memerlukan pengeditan tambahan, mereka dapat diratakan. Kedua teknik ini akan mengurangi ukuran file.
void FlatteningAnnotation() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("OptimizeDocument.pdf");
// String untuk nama file output
String outfilename("OptimizeDocument_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Meratakan anotasi
for(auto page : document->get_Pages())
{
for(auto annotation : page->get_Annotations())
{
annotation->Flatten();
}
}
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Menghapus Bidang Formulir
Menghapus formulir dari PDF Anda juga akan mengoptimalkan dokumen Anda. Jika dokumen PDF berisi AcroForms, kita dapat mencoba mengurangi ukuran file dengan meratakan bidang formulir.
void FlatteningFormFields() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("OptimizeFormField.pdf");
// String untuk nama file output
String outfilename("OptimizeFormField_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Ratakan bidang formulir
// Ratakan Formulir
if (document->get_Form()->get_Fields()->get_Count() > 0)
{
for(auto item : document->get_Form()->get_Fields())
{
item->Flatten();
}
}
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Mengonversi PDF dari ruang warna RGB ke skala abu-abu
File PDF terdiri dari Teks, Gambar, Lampiran, Anotasi, Grafik, dan objek lainnya. Anda mungkin menemui persyaratan untuk mengonversi PDF dari ruang warna RGB ke skala abu-abu agar lebih cepat saat mencetak file PDF tersebut. Selain itu, ketika file dikonversi ke skala abu-abu, ukuran dokumen juga berkurang, tetapi ini juga dapat menyebabkan penurunan kualitas dokumen. Fitur ini saat ini didukung oleh fitur Pre-Flight dari Adobe Acrobat, tetapi ketika berbicara tentang otomatisasi Office, Aspose.PDF adalah solusi utama untuk memberikan kemudahan semacam itu untuk manipulasi dokumen. Untuk memenuhi persyaratan ini, cuplikan kode berikut dapat digunakan.
void ConvertPDFfromColorspaceToGrayscale() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("OptimizeDocument.pdf");
// String untuk nama file output
String outfilename("Test-gray_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
auto strategy = MakeObject<Aspose::Pdf::RgbToDeviceGrayConversionStrategy>();
for (int idxPage = 1; idxPage <= document->get_Pages()->get_Count(); idxPage++)
{
// Dapatkan instance dari halaman tertentu dalam PDF
auto page = document->get_Pages()->idx_get(idxPage);
// Konversi gambar ruang warna RGB ke ruang warna GrayScale
strategy->Convert(page);
}
// Simpan file hasil
document->Save(_dataDir + outfilename);
}
FlateDecode Compression
Aspose.PDF untuk C++ menyediakan dukungan kompresi FlateDecode untuk fungsionalitas Optimasi PDF. Untuk mengoptimalkan gambar menggunakan Kompresi FlateDecode, atur opsi optimasi ke Flate. Cuplikan kode berikut menunjukkan cara menggunakan opsi dalam Optimasi untuk menyimpan gambar dengan kompresi FlateDecode:
void FlatDecodeCompression() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file input
String infilename("FlateDecodeCompression.pdf");
// String untuk nama file output
String outfilename("FlateDecodeCompression_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>(_dataDir + infilename);
// Inisialisasi OptimizationOptions
auto optimizationOptions = MakeObject<Aspose::Pdf::Optimization::OptimizationOptions>();
// Untuk mengoptimalkan gambar menggunakan Kompresi FlateDecode, atur opsi optimasi ke Flate
optimizationOptions->get_ImageCompressionOptions()->set_Encoding(Aspose::Pdf::Optimization::ImageEncoding::Flate);
// Optimalkan dokumen PDF menggunakan OptimizationOptions
document->OptimizeResources(optimizationOptions);
// Simpan dokumen yang diperbarui
document->Save(_dataDir + outfilename);
}
Simpan Gambar di XImageCollection
Aspose.PDF untuk C++ menyediakan kemampuan untuk menyimpan gambar baru ke dalam XImageCollection dengan kompresi FlateDecode. Untuk mengaktifkan opsi ini, Anda dapat menggunakan flag ImageFilterType.Flate. Cuplikan kode berikut menunjukkan cara menggunakan fungsionalitas ini:
void StoreImageInXImageCollection() {
// String untuk nama jalur
String _dataDir("C:\\Samples\\");
// String untuk nama file keluaran
String outfilename("FlateDecodeCompression_out.pdf");
// Buka dokumen
auto document = MakeObject<Document>();
auto page = document->get_Pages()->Add();
auto imageStream = System::IO::File::OpenRead(_dataDir + u"aspose-logo.jpg");
page->get_Resources()->get_Images()->Add(imageStream, Aspose::Pdf::ImageFilterType::Flate);
auto ximage = page->get_Resources()->get_Images()->idx_get(page->get_Resources()->get_Images()->get_Count());
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::GSave>());
// Atur koordinat
int lowerLeftX = 0;
int lowerLeftY = 0;
int upperRightX = 600;
int upperRightY = 600;
auto rectangle = MakeObject<Rectangle>(lowerLeftX, lowerLeftY, upperRightX, upperRightY);
auto matrix = MakeObject<Matrix>(new double[] {rectangle->get_URX() - rectangle->get_LLX(), 0, 0, rectangle->get_URY() - rectangle->get_LLY(), rectangle->get_LLX(), rectangle->get_LLY()});
// Menggunakan operator ConcatenateMatrix (menggabungkan matriks): menentukan bagaimana gambar harus ditempatkan
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::ConcatenateMatrix>(matrix));
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::Do>(ximage->get_Name()));
page->get_Contents()->Add(MakeObject<Aspose::Pdf::Operators::GRestore>());
document->Save(_dataDir + outfilename);
}