C++'ta PDF Belgeleriyle Nasıl Çalışılır

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.git
add_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 build

Araç 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.

Ayrıca Bakınız

 Türkçe