C++'ta Bir Belge Nasıl Yüklenir

C++'ta Bir Belge Nasıl Yüklenir

Aspose.PDF FOSS for C++ mevcut bir PDF’yi Document sınıfı aracılığıyla açar — düz bir dosya yolu üzerinden ya da kaynak şifrelenmişse bir şifre ile — ve dosyanın /Info üst verilerini DocumentInfo aracılığıyla sunar. Bu kılavuz, bir belgeyi yüklemeyi, şifre korumalı dosyaları algılamayı ve açmayı, başlık/yazar/üretici üst verilerini okumayı ve güncellemeyi ve sonucu kaydetmeyi kapsar. Kütüphane, bir proje içine CMake aracılığıyla eklenir; paket yöneticisi kurulum adımı yoktur.

Adım Adım Kılavuz

Adım 1: Paketi Kurun

Kütüphaneyi bir CMake alt dizini olarak ekleyin ve aspose_pdf_foss hedefiyle bağlayın:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Araç zincirinin ve başlık dosyalarının çözüldüğünü, minimal bir program derleyerek doğrulayın:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}

pages: 0 yazdıran başarılı bir derleme, kütüphanenin doğru şekilde bağlandığını doğrular.


Adım 2: Gerekli Sınıfları İçe Aktarın

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>

using namespace Aspose::Pdf;

Document ve DocumentInfo, Aspose::Pdf ad alanının altında doğrudan bildirilir.


Adım 3: Bir Dosya Yolundan PDF Belgesi Açın

The Document(filename) yapıcı dosyayı okur, çapraz referans tablosunu ve sayfa ağacını ayrıştırır ve bellek içi modeli oluşturur. Dosya mevcut değilse veya okunamıyorsa std::system_error fırlatır ve dosya geçerli bir PDF değilse std::runtime_error fırlatır:

#include <iostream>
#include <stdexcept>

try {
    Document doc("input.pdf");
    std::cout << "Pages: " << doc.Pages().Count() << "\n";
} catch (const std::runtime_error& e) {
    std::cerr << "Not a valid PDF: " << e.what() << "\n";
} catch (const std::system_error& e) {
    std::cerr << "Could not read file: " << e.what() << "\n";
}

Adım 4: Şifre Koruması Olan Belgeyi Açın

Adım 3’teki tek parametreli yapıcı hiçbir zaman bir şifreyi doğrulamaz veya trailer’ın /Encrypt girişini incelemez, bu yüzden bu şekilde açılan bir belgede IsEncrypted() her zaman false raporlar — kaynak dosya gerçekten şifrelenmiş olsa bile. Şifreli bir PDF’yi tespit etmek ve açmak için, /Encrypt okuyan ve sağladığınız şifreyi doğrulayan iki parametreli yapıcıyı kullanın:

try {
    Document doc("input.pdf", "user-password");
    if (doc.IsEncrypted()) {
        std::cout << "Opened an encrypted document.\n";
    }
} catch (const std::runtime_error& e) {
    // Thrown when /Encrypt is present and the password matches
    // neither the user nor the owner entry in the trailer.
    std::cerr << "Wrong password or unreadable /Encrypt dictionary: "
              << e.what() << "\n";
}

Kaynak PDF şifrelenmemişse, şifre argümanı basitçe yok sayılır ve belge normal şekilde açılır — bu yüzden bir dosyanın korunup korunmadığından emin olmasanız bile iki parametreli yapıcıyı kullanmak güvenlidir.


Adım 5: DocumentInfo ile Belge Üst Verilerini Okuyun

Document.Info() döndürür bir DocumentInfo& belge’nin /Info sözlüğüne bağlı. Her önceden tanımlı alanın kendi okuma erişicisi vardır, ki bu anahtar kaynak dosyada bulunmadığında boş bir dize döndürür:

Document doc("input.pdf");
DocumentInfo& info = doc.Info();

std::cout << "Title: "    << info.Title()    << "\n";
std::cout << "Author: "   << info.Author()   << "\n";
std::cout << "Subject: "  << info.Subject()  << "\n";
std::cout << "Producer: " << info.Producer() << "\n";
std::cout << "Creator: "  << info.Creator()  << "\n";
std::cout << "Keywords: " << info.Keywords() << "\n";

DocumentInfo::IsPredefinedKey, verilen bir /Info anahtar adının bu yerleşik alanlardan biri olup olmadığını raporlar, Add ile eklenen özel bir anahtardan farklı olarak:

bool builtin = DocumentInfo::IsPredefinedKey("Title");   // true
bool custom  = DocumentInfo::IsPredefinedKey("MyKey");   // false

Adım 6: Üst Veriyi Güncelle ve Belgeyi Kaydet

Üst veriyi eşleşen ayarlayıcı aşırı yüklemeleriyle veya Document üzerindeki SetTitle kullanışlı yöntemiyle ayarlayın, ardından değişikliği Save ile kalıcı hale getirin:

Document doc("input.pdf");
doc.Info().Author("Report Generator");
doc.SetTitle("Quarterly Report");   // equivalent to doc.Info().Title(title)

doc.Save("output.pdf");

Üst veri düzenlemeleri bellekte hazırlanır ve yalnızca bir sonraki Save çağrısında yazılır. Yeni bir yola yazmak için Save(outputFileName) çağırın, ya da belge başlangıçta açıldığı dosyayı üzerine yazmak için argümansız Save() kullanın:

Document doc("input.pdf");
doc.SetTitle("Updated In Place");
doc.Save();   // writes back to "input.pdf"

Yaygın Sorunlar ve Çözümler

IsEncrypted() returns false şifre korumalı olduğunu bildiğim bir PDF için

Tek argümanlı Document(path) yapıcı, dosyanın /Encrypt sözlüğüne karşı asla kimlik doğrulaması yapmaz, bu yüzden IsEncrypted() bu şekilde açılan bir belgede false rapor eder, kaynağın gerçekten şifreli olup olmadığına bakılmaksızın. Dosyayı iki argümanlı Document(path, password) yapıcıyla açın — bu, şifreleme durumunu dolduran tek aşırı yüklemedir.

İki argümanlı yapıcı istisna fırlatıyor std::runtime_error

Bu, kaynak PDF’nin trailer’ında bir /Encrypt girdisi olduğu ve sağlanan şifrenin orada kaydedilen ne kullanıcı ne de sahibi şifresiyle eşleşmediği anlamına gelir. std::runtime_error yakalayın ve doğru şifreyi sorarak isteyin, ya da yeniden denemeden önce şifreyi kanaldışı olarak doğrulayın.

Save() “no source filename to save to” hatasını fırlatır

Argümansız Save(), belgenin oluşturulduğu yola geri yazar. Argümansız yapıcıyla oluşturulan bir Document — kaynak dosyası olmayan yeni, bellek içi bir belge — geri yazılacak bir yola sahip değildir, bu yüzden Save() fırlatır. Bunun yerine Save(outputFileName) çağırın.

Decrypt() korumasız bir dosya üretmiyor gibi görünüyor

Decrypt(), bellek içi IsEncrypted() bayrağını temizler, böylece sonraki okumalarda belge düz metin olarak değerlendirilir, ancak mevcut sürümde trailer’ın /Encrypt sözlüğünü yeniden yazmaz veya şifreli dizeleri ve akışları yeniden kodlamaz. Decrypt() sonrası yapılan bir Save() çağrısı hâlâ orijinal baytları, orijinal şifreleme dahil, geri yazar — bu yöntem henüz diskte düz metin bir kopya üretmez.

Başlık/Yazar/vb. boş stringler olarak yazdırılır

DocumentInfo erişimcileri, ilgili /Info anahtarı kaynak PDF’de bulunmadığında hata yerine boş bir dize döndürür. Boş bir sonuç, alanın o belgede hiç ayarlanmadığı anlamına gelir, okumanın başarısız olduğu anlamına gelmez.

Sık Sorulan Sorular

Document(path) şifrelenmiş bir PDF üzerinde çalışır mı?

Genellikle sayfa ağacını hata atmadan ayrıştırır, ancak hiçbir zaman bir şifreyi doğrulamaz ve her zaman IsEncrypted() değerini false olarak bırakır. Kaynak şifreli olabilecek durumlarda iki argümanlı yapıcıyı kullanın.

Şifreli olmadığı ortaya çıkan bir dosya için Document(path, password)‘a bir şifre geçirmek güvenli mi?

Evet. Trailer’da /Encrypt girişi olmadığında, şifre argümanı göz ardı edilir ve belge, tek parametreli yapıcıyla açılacağı gibi aynı şekilde açılır.

Özel bir /Info anahtarını yerleşik bir anahtardan nasıl ayırt edebilirim?

Statik DocumentInfo::IsPredefinedKey(key)‘ı çağırın. Title, Author, Subject, Keywords, Creator, Producer ve Trapped için true döndürür, diğer tüm durumlar için ise false döndürür.

Yüklediğim dosyayı yeni bir yola yazmak yerine üzerine yazabilir miyim?

Evet — dosya yolundan oluşturulmuş bir Document üzerinde parametresiz Save() çağırın; aynı kaynak yoluna geri yazar. Parametresiz yapıcıyla oluşturulmuş ve kaynak yolu olmayan belgeler için bir istisna fırlatır.

Decrypt() sonrası kaydetmek PDF’nin şifre korumasını kaldırır mı?

Hayır, mevcut sürümde değil — yukarıdaki Ortak Sorunlar bölümüne bakın. Decrypt() yalnızca içerik okuyucular tarafından kullanılan bellek içi durumu etkiler; Save() tarafından yazılan dosya hâlâ orijinal /Encrypt sözlüğünü taşır.

Ayrıca Bakınız

 Türkçe