title: Manipulasi Dokumen PDF
linktitle: Manipulasi Dokumen PDF
type: docs
weight: 30
url: /id/cpp/manipulate-pdf-document/
lastmod: "2021-11-11"
description: Bagian ini menjelaskan tentang validasi Dokumen PDF untuk Standar PDF A, cara bekerja dengan TOC, cara mengatur tanggal kedaluwarsa PDF, dan cara menentukan Progres dari pembuatan file PDF.
lastmod: "2021-11-11"
sitemap:
    changefreq: "monthly"
    priority: 0.7
---

## Validasi Dokumen PDF untuk Standar PDF A (A 1A dan A 1B)

Untuk memvalidasi dokumen PDF agar sesuai dengan kompatibilitas PDF/A-1a atau PDF/A-1b, gunakan kelas [Document](https://reference.aspose.com/pdf/cpp/class/aspose.pdf.document) metode [Validate](https://reference.aspose.com/pdf/cpp/class/aspose.pdf.document#aa1ac4565b320807c718c44eeee7cda8c). Metode ini memungkinkan Anda untuk menentukan nama file di mana hasil akan disimpan dan jenis validasi yang diperlukan [PdfFormat](https://reference.aspose.com/pdf/cpp/namespace/aspose.pdf#ac83739fd7c818167c2fdc4dd554de763) enumerasi: PDF_A_1A atau PDF_A_1B.






Cuplikan kode berikut menunjukkan cara memvalidasi dokumen PDF untuk PDF/A-1A.

```cpp
void ExampleValidate01() {
    // String untuk nama jalur.
    String _dataDir("C:\\Samples\\");

    // String untuk nama file.
    String inputFileName("ValidatePDFAStandard.pdf");
    String outputFileName("Validation-result-A1A.xml");

    // Buka dokumen
    auto document = MakeObject<Document>(_dataDir + inputFileName);
    // Validasi PDF untuk PDF/A-1a
    document->Validate(_dataDir + outputFileName, PdfFormat::PDF_A_1A);
}

Cuplikan kode berikut menunjukkan cara memvalidasi dokumen PDF untuk PDF/A-1B.

void ExampleValidate02() {
    // String untuk nama jalur.
    String _dataDir("C:\\Samples\\");

    // String untuk nama file.
    String inputFileName("ValidatePDFAStandard.pdf");
    String outputFileName("Validation-result-A1B.xml");

    // Buka dokumen
    auto document = MakeObject<Document>(_dataDir + inputFileName);
    // Validasi PDF untuk PDF/A-1a
    document->Validate(_dataDir + outputFileName, PdfFormat::PDF_A_1B);
}

Bekerja dengan TOC

Tambahkan TOC ke PDF yang Ada

API Aspose.PDF memungkinkan Anda untuk menambahkan daftar isi baik saat membuat PDF, atau ke file yang sudah ada.

Untuk menambahkan TOC ke file PDF yang sudah ada, gunakan kelas Heading dalam namespace Aspose.Pdf. Namespace Aspose.Pdf memungkinkan Anda untuk membuat dan memanipulasi file PDF yang sudah ada. Untuk menambahkan TOC ke PDF yang sudah ada, gunakan namespace Aspose.Pdf.

Cuplikan kode berikut menunjukkan cara membuat daftar isi di dalam file PDF yang sudah ada.

void ExampleToc01() {
    // String untuk nama jalur.
    String _dataDir("C:\\Samples\\");

    // String untuk nama file
    String inputFileName("AddTOC.pdf");
    String outputFileName("TOC_out.pdf");

    auto document = MakeObject<Document>(_dataDir + inputFileName);

    // Dapatkan akses ke halaman pertama file PDF
    auto tocPage = document->get_Pages()->Insert(1);

    // Buat objek untuk merepresentasikan informasi TOC
    auto tocInfo = MakeObject<TocInfo>();
    auto title = MakeObject<TextFragment>("Table Of Contents");
    title->get_TextState()->set_FontSize(20);
    title->get_TextState()->set_FontStyle(FontStyles::Bold);

    // Tetapkan judul untuk TOC
    tocInfo->set_Title(title);
    tocPage->set_TocInfo(tocInfo);

    // Buat objek string yang akan digunakan sebagai elemen TOC
    auto titles = MakeArray<String>(4);
    titles->SetValue(u"First page", 0);
    titles->SetValue(u"Second page", 1);
    titles->SetValue(u"Third page", 2);
    titles->SetValue(u"Fourth page", 3);

    for (int i = 0; i < 2; i++)
    {
        // Buat objek Heading
        auto heading2 = MakeObject<Heading>(1);
        auto segment2 = MakeObject<TextSegment>();
        heading2->set_TocPage(tocPage);
        heading2->get_Segments()->Add(segment2);

        // Tentukan halaman tujuan untuk objek heading

        heading2->set_DestinationPage(document->get_Pages()->idx_get(i + 2));

        // Halaman tujuan
        heading2->set_Top(document->get_Pages()->idx_get(i + 2)->get_Rect()->get_Height());

        // Koordinat tujuan
        segment2->set_Text(titles[i]);

        // Tambahkan heading ke halaman yang berisi TOC
        tocPage->get_Paragraphs()->Add(heading2);
    }

    // Simpan dokumen yang diperbarui
    document->Save(_dataDir + outputFileName);
}

Mengatur TabLeaderType yang Berbeda untuk Level TOC yang Berbeda

Aspose.PDF untuk C++ juga memungkinkan pengaturan TabLeaderType yang berbeda untuk level TOC yang berbeda. Anda perlu mengatur properti LineDash dari FormatArray dengan nilai yang sesuai dari TabLeaderType. Selanjutnya, Anda dapat menambahkan bagian daftar ke koleksi bagian dari dokumen Pdf. Setelah itu, buat bagian dalam dokumen Pdf dan simpan file PDF.

void ExampleToc02() {
    // String untuk nama path.
    String _dataDir("C:\\Samples\\");

    // String untuk nama file.
    String inputFileName("AddTOC.pdf");

    String outputFileName("TOC_out.pdf");

    auto document = MakeObject<Document>(_dataDir + inputFileName);

    auto tocPage = document->get_Pages()->Add();
    auto tocInfo = MakeObject<TocInfo>();

    //atur LeaderType
    tocInfo->set_LineDash(TabLeaderType::Solid);

    // Buat objek untuk merepresentasikan informasi TOC
    auto tocInfo = MakeObject<TocInfo>();
    auto title = MakeObject<TextFragment>("Table Of Contents");
    title->get_TextState()->set_FontSize(20);
    title->get_TextState()->set_FontStyle(FontStyles::Bold);

    // Atur judul untuk TOC
    tocInfo->set_Title(title);

    //Tambahkan bagian daftar ke koleksi bagian dari dokumen Pdf
    tocPage->set_TocInfo(tocInfo);

    //Definisikan format dari daftar empat level dengan mengatur margin kiri
    //dan
    //pengaturan format teks dari setiap level

    tocInfo->set_FormatArrayLength(4);
    tocInfo->get_FormatArray()->idx_get(0)->get_Margin()->set_Left(0);
    tocInfo->get_FormatArray()->idx_get(0)->get_Margin()->set_Right(30);
    tocInfo->get_FormatArray()->idx_get(0)->set_LineDash(TabLeaderType::Dot);
    tocInfo->get_FormatArray()->idx_get(0)->get_TextState()->set_FontStyle(FontStyles::Bold | FontStyles::Italic);
    tocInfo->get_FormatArray()->idx_get(1)->get_Margin()->set_Left(10);
    tocInfo->get_FormatArray()->idx_get(1)->get_Margin()->set_Right(30);
    tocInfo->get_FormatArray()->idx_get(1)->set_LineDash(TabLeaderType::None);
    tocInfo->get_FormatArray()->idx_get(1)->get_TextState()->set_FontSize(10);
    tocInfo->get_FormatArray()->idx_get(2)->get_Margin()->set_Left(20);
    tocInfo->get_FormatArray()->idx_get(2)->get_Margin()->set_Right(30);
    tocInfo->get_FormatArray()->idx_get(2)->get_TextState()->set_FontStyle(FontStyles::Bold);
    tocInfo->get_FormatArray()->idx_get(3)->set_LineDash(TabLeaderType::Solid);
    tocInfo->get_FormatArray()->idx_get(3)->get_Margin()->set_Left(30);
    tocInfo->get_FormatArray()->idx_get(3)->get_Margin()->set_Right(30);
    tocInfo->get_FormatArray()->idx_get(3)->get_TextState()->set_FontStyle(FontStyles::Bold);

    //Buat bagian dalam dokumen Pdf
    auto page = document->get_Pages()->Add();

    //Tambahkan empat judul dalam bagian
    for (int Level = 1; Level <= 4; Level++)
    {
    auto heading2 = MakeObject<Heading>(Level);
    auto segment2 = MakeObject<TextSegment>();

    heading2->get_Segments()->Add(segment2);
    heading2->set_IsAutoSequence(true);
    heading2->set_TocPage(tocPage);
    segment2->set_Text(u"Sample Heading" + Level);
    heading2->get_TextState()->set_Font(FontRepository::FindFont(u"Arial Unicode MS"));

    //Tambahkan judul ke dalam Daftar Isi.
    heading2->set_IsInList(true);
    page->get_Paragraphs()->Add(heading2);
    }

    // simpan Pdf
    document->Save(_dataDir + outputFileName);
}

Sembunyikan Nomor Halaman di TOC

Jika Anda ingin menyembunyikan nomor halaman bersama dengan judul di daftar isi, Anda dapat menggunakan properti IsShowPageNumbers dari Kelas TOCInfo sebagai false.

Silakan periksa potongan kode berikut untuk menyembunyikan nomor halaman di daftar isi:

void ExampleToc03() {
    // String untuk nama jalur.
    String _dataDir("C:\\Samples\\");

    // String untuk nama file.
    String inputFileName("AddTOC.pdf");

    String outputFileName("TOC_out.pdf");

    auto document = MakeObject<Document>(_dataDir + inputFileName);
    auto tocPage = document->get_Pages()->Add();

    // Buat objek untuk merepresentasikan informasi TOC
    auto tocInfo = MakeObject<TocInfo>();
    auto title = MakeObject<TextFragment>("Daftar Isi");
    title->get_TextState()->set_FontSize(20);
    title->get_TextState()->set_FontStyle(FontStyles::Bold);

    // Atur judul untuk TOC
    tocInfo->set_Title(title);

    //Tambahkan bagian daftar ke koleksi bagian dari dokumen Pdf  
    tocPage->set_TocInfo(tocInfo);

    tocInfo->set_IsShowPageNumbers(false);

    //Definisikan format dari empat level daftar dengan mengatur margin kiri dan
    //pengaturan format teks dari setiap level

    tocInfo->set_FormatArrayLength(4);
    tocInfo->get_FormatArray()->idx_get(0)->get_Margin()->set_Right(0);
    tocInfo->get_FormatArray()->idx_get(0)->get_TextState()->set_FontStyle(FontStyles::Bold | FontStyles::Italic);
    tocInfo->get_FormatArray()->idx_get(1)->get_Margin()->set_Left(30);
    tocInfo->get_FormatArray()->idx_get(1)->get_TextState()->set_Underline(true);
    tocInfo->get_FormatArray()->idx_get(1)->get_TextState()->set_FontSize(10);
    tocInfo->get_FormatArray()->idx_get(2)->get_TextState()->set_FontStyle(FontStyles::Bold);
    tocInfo->get_FormatArray()->idx_get(3)->get_TextState()->set_FontStyle(FontStyles::Bold);

    auto page = document->get_Pages()->Add();
    //Tambahkan empat judul di bagian tersebut
    for (int Level = 1; Level != 5; Level++)
    {
        auto heading2 = MakeObject<Heading>(Level);
        auto segment2 = MakeObject<TextSegment>();
        heading2->set_TocPage(tocPage);
        heading2->get_Segments()->Add(segment2);
        heading2->set_IsAutoSequence(true);
        segment2->set_Text(u"ini adalah judul dari level " + Level);
        heading2->set_IsInList(true);
        page->get_Paragraphs()->Add(heading2);
    }
    // simpan Pdf
    document->Save(_dataDir + outputFileName);
}

Cara mengatur tanggal kedaluwarsa PDF

Kami menerapkan hak akses pada file PDF sehingga sekelompok pengguna tertentu dapat mengakses fitur/objek tertentu dari dokumen PDF. Untuk membatasi akses file PDF, biasanya kami menerapkan enkripsi dan kami mungkin memiliki persyaratan untuk mengatur kedaluwarsa file PDF, sehingga pengguna yang mengakses/melihat dokumen mendapatkan pemberitahuan yang valid mengenai kedaluwarsa file PDF.

Untuk mencapai persyaratan yang disebutkan di atas, kami dapat menggunakan objek JavascriptAction. Silakan periksa cuplikan kode berikut.

void SetPDFexpiryDate() {

    // String untuk nama path.
    String _dataDir("C:\\Samples\\");

    // String untuk nama file. 
    String outputFileName("SetExpiryDate_out.pdf");

    // Instansiasi objek Document
    auto document = MakeObject<Document>();

    // Tambahkan halaman ke koleksi halaman file PDF
    document->get_Pages()->Add();

    // Tambahkan potongan teks ke koleksi paragraf dari objek halaman
    document->get_Pages()->idx_get(1)->get_Paragraphs()->Add(new TextFragment(u"Hello World..."));

    String javascriptCode(u"var year=2017;");
    javascriptCode += u"var month=5;";
    javascriptCode += u"today = new Date(); today = new Date(today.getFullYear(), today.getMonth());";
    javascriptCode += u"expiry = new Date(year, month);";
    javascriptCode += u"if (today.getTime() > expiry.getTime())";
    javascriptCode += u"app.alert('The file is expired. You need a new one.');";

    // Buat objek JavaScript untuk mengatur tanggal kedaluwarsa PDF
    auto javaScript = MakeObject<Aspose::Pdf::Annotations::JavascriptAction>(javascriptCode);

    // Atur JavaScript sebagai tindakan pembukaan PDF
    document->set_OpenAction(javaScript);

    // Simpan Dokumen PDF
    document->Save(_dataDir + outputFileName);
}

Menentukan Kemajuan Pembuatan File PDF

Seorang pelanggan meminta kami untuk menambahkan fitur yang memungkinkan pengembang menentukan kemajuan pembuatan file PDF. Berikut adalah tanggapan terhadap permintaan tersebut.

Bidang CustomerProgressHandler dari kelas DocSaveOptions memungkinkan Anda untuk menentukan bagaimana pembuatan PDF berjalan.

Cuplikan kode di bawah ini menunjukkan cara menggunakan CustomerProgressHandler.

using ProgressHandler = System::MulticastDelegate<void(SharedPtr<UnifiedSaveOptions::ProgressEventHandlerInfo>)>;
void ConversionProgressCallback(SharedPtr<UnifiedSaveOptions::ProgressEventHandlerInfo> eventInfo)
{
    String eventType;
    switch (eventInfo->EventType)
    {
    case ProgressEventType::ResultPageCreated:
        eventType = u"ResultPageCreated";
        break;
    case ProgressEventType::ResultPageSaved:
        eventType = u"ResultPageSaved";
        break;
    case ProgressEventType::SourcePageAnalysed:
        eventType = u"SourcePageAnalysed";
        break;
    case ProgressEventType::TotalProgress:
        eventType = u"TotalProgress";
        break;
    }
    Console::WriteLine(String::Format(u"Jenis kejadian: {0}, Nilai: {1}, Nilai Maksimal: {2}", 
        eventType, eventInfo->Value, eventInfo->MaxValue));
}
void DetermineProgressOfPDFfileGeneration() {
    // String untuk nama path.
    String _dataDir("C:\\Samples\\");

    // String untuk nama file.
    String inputFileName("AddTOC.pdf");

    String outputFileName("TOC_out.pdf");

    auto document = MakeObject<Document>(_dataDir + inputFileName);
    // Buka dokumen
    auto saveOptions = MakeObject<DocSaveOptions>();

    saveOptions->CustomProgressHandler = ProgressHandler(ConversionProgressCallback);

    document->Save(_dataDir + outputFileName, saveOptions);
}

Ratakan PDF yang Dapat Diisi di C++

Dokumen PDF sering kali menyertakan formulir dengan widget interaktif yang dapat diisi seperti tombol radio, kotak centang, kotak teks, daftar, dll. Untuk membuatnya tidak dapat diedit untuk berbagai tujuan aplikasi, kita perlu meratakan file PDF tersebut. Aspose.PDF untuk C++ menyediakan fungsi untuk meratakan PDF Anda di C++ hanya dengan beberapa baris kode:

void FlattenFillablePDF() {
    // String untuk nama path.
    String _dataDir("C:\\Samples\\");
    // String untuk nama file.
    String inputFileName("sample-form.pdf");
    String outputFileName("FlattenForms_out.pdf");

    auto document = MakeObject<Document>(_dataDir + inputFileName);

    // Ratakan PDF yang Dapat Diisi
    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 + outputFileName);
}