1. Товары
  2.   PDF
  3.   C++
  4.   PDFium-Render
 
  

Бесплатная библиотека C++ для рендеринга страниц PDF в изображения и извлечения текста.

Открытая библиотека C++ для обработки PDF, позволяющая рендерить страницы PDF в изображения, извлекать текст, работать с PDF, защищёнными паролем, и получать доступ к метаданным документа через C++ API.

Что такое PDFium-Render?

Обработка и рендеринг PDF в C++ приложении исторически был сложной задачей, часто требующей дорогих коммерческих лицензий или громоздких open‑source инструментов. Представляем PDFium-Render — современную библиотеку‑обёртку только с заголовками для C++, которая приносит мощность движка PDFium от Google в ваши проекты через интуитивный и чистый интерфейс. PDFium-render — безопасная, идиоматичная привязка PDFium для Rust, тот же движок рендеринга PDF, который используется в Google Chrome и Mozilla Firefox. Созданная и поддерживаемая ajrcarey, эта библиотека предоставляет разработчикам мощный набор инструментов для рендеринга страниц PDF в изображения, извлечения текста, манипулирования структурами PDF и доступа к метаданным документов — всё это с учётом гарантий безопасности памяти Rust.

В отличие от многих библиотек PDF, которые сосредоточены исключительно на создании или базовом разборе, PDFium-Render превосходно рендерит PDF‑контент с пиксельной точностью, что делает её идеальной для приложений, которым необходимо отображать, конвертировать или обрабатывать существующие PDF‑документы. Она поддерживает различные базовые и продвинутые функции работы с PDF‑документами, такие как рендеринг PDF‑файлов и страниц, извлечение и анализ текста, работа с метаданными документа, доступ и манипуляция объектами страниц, работа с PDF, защищёнными паролем, и многое другое. Одним из величайших преимуществ pdfium-render является кросс‑платформенная поддержка. Библиотека беспрепятственно работает на Windows, macOS и Linux, абстрагируя различия платформ в бинарных файлах PDFium. Независимо от того, создаёте ли вы просмотрщик документов, автоматизируете рабочие процессы обработки PDF или извлекаете данные из PDF, pdfium-render предоставляет необходимые инструменты.

Previous Next

Начало работы с PDFium-Render

Рекомендуемый способ установки PDFium-Render — использование CMake. Пожалуйста, используйте следующую команду для гладкой установки.

Установить PDFium-Render через GitHub

 vcpkg install pdfium-render

Установить PDFium-Render через GitHub

 Git clone https://github.com/ajrcarey/pdfium-render.git 

Вы также можете установить его вручную; загрузите последние файлы релиза напрямую из репозитория GitHub.

Высококачественная отрисовка PDF с помощью C++

Основное преимущество открытой библиотеки PDFium-Render заключается в её возможностях рендеринга. Она может преобразовывать страницы PDF в растровые изображения с исключительным качеством, поддерживая различные форматы вывода, включая PNG, JPEG и BMP. Рендеринговый движок обрабатывает сложные функции PDF, такие как прозрачность, градиенты, встроенные шрифты и векторную графику, с той же точностью, которую вы ожидаете от PDF‑просмотрщика Chrome. Ниже приведён простой пример, показывающий, как разработчики могут отрисовать конкретную страницу в формате PNG внутри C++ приложений.

Как отрисовать конкретную страницу PDF в формате PNG с помощью C++?

use pdfium_render::prelude::*;

fn render_pdf_page() -> Result<(), PdfiumError> {
    // Initialize PDFium library
    let pdfium = Pdfium::new(
        Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
            .or_else(|_| Pdfium::bind_to_system_library())?
    );
    
    // Load a PDF document
    let document = pdfium.load_pdf_from_file("sample.pdf", None)?;
    
    // Get the first page
    let page = document.pages().get(0)?;
    
    // Render the page to a bitmap at 300 DPI
    let bitmap = page.render_with_config(
        &PdfRenderConfig::new()
            .set_target_width(2480) // 300 DPI for 8.27 inches
            .set_target_height(3508) // 300 DPI for 11.69 inches
    )?;
    
    // Save as PNG
    bitmap.as_image().as_rgba8().unwrap()
        .save("output.png")?;
    
    Ok(())
}

Извлечение текста и анализ с помощью библиотеки C++

Помимо рендеринга, библиотека PDFium-Render предоставляет всесторонние возможности извлечения текста. API для извлечения текста интуитивно понятен и мощен. Разработчики могут извлекать текст с отдельных страниц, искать конкретные строки и даже получать информацию о позиционировании символов, используя всего несколько строк кода — это критически важно для реализации функций, таких как выделение текста или подсветка. Следующий пример показывает, как разработчики могут извлекать текст из определённых областей страниц PDF внутри C++ приложений.

Как извлечь текст из определённых областей страниц PDF с помощью C++ API?

use pdfium_render::prelude::*;

fn extract_text_from_page() -> Result<(), PdfiumError> {
    let pdfium = Pdfium::new(
        Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
            .or_else(|_| Pdfium::bind_to_system_library())?
    );
    
    let document = pdfium.load_pdf_from_file("document.pdf", None)?;
    let page = document.pages().get(0)?;
    
    // Extract all text from the page
    let text = page.text()?;
    let all_text = text.all();
    println!("Page text: {}", all_text);
    
    // Search for specific text
    let search_results = text.search("important", true, false)?;
    for result in search_results {
        println!("Found at index: {}", result.start_index());
    }
    
    // Get text in a specific rectangular area
    let rect = PdfRect::new(100.0, 100.0, 300.0, 200.0);
    let bounded_text = text.bounded(rect)?;
    println!("Text in region: {}", bounded_text);
    
    Ok(())
}

 

Word с PDF, защищённым паролем, через C++

Безопасность имеет первостепенное значение при работе с документами. PDFium-Render без проблем обрабатывает PDF-файлы, защищённые паролем, поддерживая как пользовательские, так и пароли владельца. Библиотека прозрачно управляет аутентификацией, возвращая соответствующие ошибки, если пароль неверен или если у PDF есть ограничения, препятствующие выполнению определённых операций. Ниже приведён очень полезный пример, показывающий, как обрабатывать защищённые паролем PDF‑документы в приложениях на C++.

Как открыть и загрузить защищённые паролем PDF‑документы с помощью C++ API?

fn open_encrypted_pdf() -> Result<(), PdfiumError> {
    let pdfium = Pdfium::new(
        Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
            .or_else(|_| Pdfium::bind_to_system_library())?
    );
    
    // Attempt to load with password
    let document = pdfium.load_pdf_from_file(
        "confidential.pdf", 
        Some("secret_password")
    )?;
    
    println!("Successfully opened encrypted PDF");
    println!("Pages: {}", document.pages().len());
    
    Ok(())
}

Работа с метаданными и свойствами PDF через C++

Понимание структуры PDF имеет решающее значение для многих приложений. Открытая библиотека PDFium-Render предоставляет полный доступ к метаданным документа, количеству страниц, размерам и другим свойствам. Эта функциональность незаменима при создании систем управления документами, валидаторов PDF или любого приложения, которому необходимо классифицировать или обрабатывать PDF‑файлы на основе их свойств. Ниже приведён пример кода, демонстрирующий, как программисты могут работать с метаданными PDF‑документов и легко получать доступ к различным свойствам.

Как работать с метаданными PDF‑документов через C++ API?

fn inspect_document_metadata() -> Result<(), PdfiumError> {
    let pdfium = Pdfium::new(
        Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path("./"))
            .or_else(|_| Pdfium::bind_to_system_library())?
    );
    
    let document = pdfium.load_pdf_from_file("report.pdf", None)?;
    
    // Access document metadata
    let metadata = document.metadata();
    println!("Title: {}", metadata.title().unwrap_or("Untitled"));
    println!("Author: {}", metadata.author().unwrap_or("Unknown"));
    println!("Creator: {}", metadata.creator().unwrap_or("Unknown"));
    println!("Producer: {}", metadata.producer().unwrap_or("Unknown"));
    
    // Get page count
    let page_count = document.pages().len();
    println!("Total pages: {}", page_count);
    
    // Inspect individual page properties
    for (index, page) in document.pages().iter().enumerate() {
        let width = page.width();
        let height = page.height();
        println!("Page {}: {}x{} points", index + 1, width.value, height.value);
    }
    
    Ok(())
}
 Русский