C++'ta PDF Belgeleriyle Nasıl Çalışılır
Aspose.PDF FOSS for C++ MIT lisanslı, bağımlılıksız bir C++20 kütüphanesidir ve CMake ile derlenip bağlanır — eklemek için bir paket yöneticisi içe aktarımı yoktur. Bu kılavuz, temel Document-odaklı iş akışını anlatır: mevcut bir PDF’yi açma, sayfalarını ve meta verilerini inceleme, metin çıkarma ve bir sayfayı raster görüntüye render etme.
Adım Adım Kılavuz
Adım 1: Paketi Kurun
Depoyu klonlayın ve CMake projenize bir alt dizin olarak ekleyin:
git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.gitadd_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)Ya da bağımsız olarak yapılandırıp derleyin:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build buildAraç zincirinin çözüldüğünü, başlıklara karşı 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";
}Yeni oluşturulan, boş Document için 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>
#include <aspose/pdf/page.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>Adım 3: Bir PDF Belgesi Açın ve Sayfalarını Sayın
Mevcut bir PDF’yi açmak için dosya yolundan bir Document oluşturun. Document::Pages(), PageCollection‘yi döndürür ve Count(), kaç sayfa içerdiğini raporlar:
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";Adım 4: Belge Metaverisini Okuyun
Document::Info(), standart /Info sözlük girişleri için tiplenmiş okuma/yazma erişimcileri içeren bir DocumentInfo nesnesi döndürür:
auto& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
std::cout << "Producer: " << info.Producer() << "\n";Adım 5: Bir Sayfadan Metin Çıkarın
Aspose::Pdf::Text::TextAbsorber, bir Document veya tek bir Page üzerinde yürür ve karşılaştığı metni biriktirir; Text() daha sonra sonucu döndürür. PageCollection 1-indeksli olduğundan, Pages()[1] ilk sayfadır:
auto page = doc.Pages()[1];
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";Visit() ayrıca tüm Document‘i doğrudan (absorber.Visit(doc)) kabul eder, her sayfanın metnini tek bir sayfa yerine birleştirilmiş olarak istediğinizde.
Adım 6: Sayfayı Raster Görüntüye İşleyin
BmpDevice, bir Page‘i sıkıştırılmamış BMP görüntüsüne işler. Yapıcı bir Resolution alır; bu, çıkış DPI’sını kontrol eder ve Process(), render edilen baytları herhangi bir std::ostream‘e yazar:
Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));
std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);Adım 7: Meta Verileri Güncelle ve Belgeyi Kaydet
DocumentInfo üzerindeki set metodları, sahip Document üzerinde Save() çalıştığında bir sonraki seferde temizlenen değişiklikleri sahneye alır:
doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");Yaygın Sorunlar ve Çözümler
Accessing Pages()[0] throws std::out_of_range
PageCollection 1-indeksli, kanonik Aspose.PDF semantiğiyle eşleşir — ilk sayfa Pages()[1]‘dir. 1’den düşük veya Count()‘den yüksek bir indeks hata verir.
TextAbsorber::Text() boş bir dize döndürür
Text(), en son Visit() çağrısı tarafından biriktirilen her şeyi döndürür. Text()‘u okurken Visit()‘nin gerçekten çağrıldığını doğrulayın ve ziyaret ettiğiniz sayfa ya da belgenin yalnızca taranmış görüntüler yerine çıkarılabilir metin içerdiğinden emin olun.
Oluşturulan BMP dosyası beklenmedik şekilde küçük veya boş görünüyor
Düşük bir Resolution değeri küçük bir raster görüntü üretir. Resolution‘e gönderilen DPI’yi artırın — örneğin, baskı kalitesinde çıktı için Resolution(300) — ve Process()‘e gönderilen sayfa indeksinin istediğiniz indeks olduğundan emin olun.
DocumentInfo alanlar boş dizeler olarak geri okunur
Her PDF üreticisi standart /Info girişlerini yazmaz. Üstveri çıkarımının başarısız olduğunu varsaymadan önce Producer() ve Creator()‘yi boş değerler için kontrol edin — eksik bir anahtar için tanımlı sonuç boş bir dizedir.
şununla yapılan değişiklikler Info().Title(...) kaydedilen dosyada görünmez
DocumentInfo mutasyonları bellek içinde hazırlanır ve yalnızca aynı Document örneğinde Save() bir sonraki çalıştırıldığında kalıcı hale gelir. Save() den önce, metadata düzenlemesinin gerçekleştiğinden emin olun, sonrasında değil.
Sık Sorulan Sorular
Sayfa indekslemesi Aspose.PDF FOSS for C++‘de sıfır temelli mi yoksa bir temelli mi?
Bir temelli. doc.Pages()[1] her zaman ilk sayfadır.
TextAbsorber tüm belge yerine tek bir sayfadan metin çıkarabilir mi?
Evet. Visit(), bir Document — her sayfanın metnini çıkaran — ya da tek bir Page, sadece o sayfanın metnini çıkaran — kabul edecek şekilde aşırı yüklenmiştir.
Belgeden yalnızca veri okursam Save()‘ı çağırmam gerekiyor mu?
Hayır. Save(), DocumentInfo alanlarını düzenlemek gibi dosyaya geri yazılması gereken değişikliklerden sonra gereklidir. Sayfa sayısını okumak, metin çıkarmak veya bir sayfayı renderlemek belgeyi değiştirmez.
Render edilen bir sayfanın çözünürlüğünü nasıl kontrol ederim?
Cihazın kurucusuna bir Resolution değeri geçirin — örneğin 150 DPI için Resolution(150). Daha yüksek değerler daha büyük, daha yüksek doğruluklu raster görüntüler üretir.
BmpDevice hangi formatı üretir?
Sıkıştırılmamış bir BMP görüntüsü, Process()‘e geçirilen std::ostream‘a doğrudan yazılır.