1. 製品
  2.   PDF
  3.   C++
  4.   PDFio
 
  

PDFファイルの読み書き用無料C++ PDFライブラリ

シンプルなオープンソースCベースのPDFライブラリで、PDFドキュメントの読み取り、書き込み、操作が可能です。画像をPDFに変換する機能、コンテンツの抽出、ストリームベースのPDF読み取りなど、Cアプリ内で多くの機能をサポートします。

PDFio ライブラリとは何ですか?

PDFioは、レンダリングや表示の複雑さを伴わずにPDFファイルの読み書きに特化した、軽量でオープンソースのCライブラリです。Michael R Sweetによって作成され、Apache License Version 2.0の下でライセンスされています。このライブラリは、視覚的な表示ではなく、コンテンツの作成、抽出、変換に重点を置いたシンプルなPDF操作アプローチを開発者に提供します。ライブラリは非常に扱いやすく、PDFページの抽出や結合、データベースからの自動レポート作成、透かしやスタンプの付与、証明書やディプロマの作成、アーカイブ用のフォント埋め込み、メタデータの変更など、PDFファイルの処理に関するさまざまな方法を提供します。

PDFio は基本的な I/O 操作に焦点を当てており、PDF からデータを抽出したり新しい PDF を作成したりする必要があるアプリケーションに、より複雑なライブラリのオーバーヘッドなしで最適です。このライブラリは強力な変換機能をサポートし、ソフトウェア開発者が C アプリケーション内で markdown を PDF に、画像を PDF に、HTML を PDF に変換したり、PDF 内でバーコードを生成したりできるようにします。レンダリングのオーバーヘッドを伴わないコア機能に注力しているため、サーバーサイドアプリケーション、コマンドラインツール、視覚的表示が不要な組み込みシステムでの PDF 作成や処理に最適です。文書管理システムの構築、レポート自動生成ツールの作成、PDF 分析ツールの開発など、どのような用途でも、PDFio は C アプリケーションにおけるプロフェッショナルな PDF 処理に必要な基本機能を提供します。

Previous Next

PDFio の開始方法

PDFio をインストールする推奨方法は NuGet を使用することです。スムーズなインストールのために、以下のコマンドをご利用ください。

NuGet で PDFio をインストールする

Install-Package pdfio_native 

GitHub で PDFio をインストールする

 git clone  https://github.com/michaelrsweet/pdfio.git

手動でインストールすることもできます; 最新のリリースファイルを直接 GitHub リポジトリからダウンロードしてください。

C でゼロから PDF を作成する

オープンソースの PDFio ライブラリは、C アプリケーション内でゼロから新しい PDF ドキュメントを作成するための完全なサポートを提供しています。新しい PDF ドキュメントの作成も同様に簡単で、数行の C コードだけでソフトウェア開発者は新しいページを追加したり、テキストやシンプルな図形を描画したり、画像(JPEG、PNG 形式)を追加したり、色や変換を適用したり、表や構造化レイアウトを構築したりと、さまざまなことが可能です。以下は、C コードを使用してカスタムページサイズとコンテンツを持つ新しい PDF ドキュメントを作成する方法を示すシンプ

Cライブラリを使用して単一画像をPDFに変換する方法は?

#include 
#include 
#include 

bool create_pdf_from_image(const char *image_path, 
                           const char *pdf_path,
                           const char *title) {
    pdfio_file_t *pdf;
    pdfio_obj_t *image;
    pdfio_dict_t *page_dict;
    pdfio_stream_t *page_stream;
    pdfio_rect_t media_box;
    double img_width, img_height;
    double page_width, page_height;
    double scale_x, scale_y, scale;
    double x, y;
    
    // Create the image object first to get dimensions
    // We'll use a temporary PDF for this
    pdfio_rect_t temp_box = {0, 0, 612, 792};
    pdf = pdfioFileCreate(pdf_path, "2.0", &temp_box, NULL, NULL, NULL);
    
    if (!pdf) {
        fprintf(stderr, "Error: Cannot create PDF file\n");
        return false;
    }
    
    // Set PDF metadata
    if (title) {
        pdfioFileSetTitle(pdf, title);
    }
    pdfioFileSetAuthor(pdf, "PDFio Image Converter");
    pdfioFileSetCreator(pdf, "image2pdf v1.0");
    
    // Load and embed the image
    image = pdfioFileCreateImageObjFromFile(pdf, image_path, true);
    
    if (!image) {
        fprintf(stderr, "Error: Cannot load image file: %s\n", image_path);
        pdfioFileClose(pdf);
        return false;
    }
    
    // Get image dimensions in pixels
    img_width = pdfioImageGetWidth(image);
    img_height = pdfioImageGetHeight(image);
    
    printf("Image dimensions: %.0f x %.0f pixels\n", img_width, img_height);
    
    // Create page sized to image (assuming 72 DPI)
    // This creates a PDF page that exactly fits the image
    page_width = img_width;
    page_height = img_height;
    
    media_box.x1 = 0.0;
    media_box.y1 = 0.0;
    media_box.x2 = page_width;
    media_box.y2 = page_height;
    
    // Create page dictionary and add image resource
    page_dict = pdfioDictCreate(pdf);
    pdfioDictSetRect(page_dict, "MediaBox", &media_box);
    pdfioPageDictAddImage(page_dict, "IM1", image);
    
    // Create the page
    page_stream = pdfioFileCreatePage(pdf, page_dict);
    
    // Draw image at full size (no scaling)
    pdfioContentDrawImage(page_stream, "IM1", 0, 0, 
                         page_width, page_height);
    
    // Close and save
    pdfioStreamClose(page_stream);
    pdfioFileClose(pdf);
    
    printf("Successfully created PDF: %s\n", pdf_path);
    return true;
}

int main(int argc, char *argv[]) {
    if (argc < 3) {
        fprintf(stderr, "Usage: %s   [title]\n", 
                argv[0]);
        return 1;
    }
    
    const char *title = (argc > 3) ? argv[3] : NULL;
    
    if (!create_pdf_from_image(argv[1], argv[2], title)) {
        return 1;
    }
    
    return 0;
}
 

C ライブラリで PDF を読み取りテキストを抽出する

最も一般的なタスクの一つは、PDFファイルからテキストを読み取り抽出することです。オープンソースの PDFio ライブラリは、開発者がページとそのコンテンツストリームを反復処理できるようにすることで、このプロセスを直感的にします。このライブラリは、既存の PDF からシンプルなテキスト、メタデータ、埋め込みフォント、数値、画像、ブドウ、名前などの有用な情報を抽出するフルサポートを提供します。以下の例は、既存の PDF を開き、C ライブラリを使用して基本情報を抽出する方法を示しています。

Cライブラリを使用してPDFファイルからシンプルなテキストを抽出する方法は?

#include 
#include 
#include 

// Callback function to handle text objects
static bool text_cb(const pdfio_text_t *text, void *data) {
    // Simply print the text to stdout
    printf("%s", text->utf8);
    return true;
}

int main(void) {
    pdfio_file_t *pdf;
    pdfio_page_t *page;

    // Open the PDF file for reading
    pdf = pdfioFileOpen("example.pdf", NULL, NULL, NULL);
    if (!pdf) {
        fprintf(stderr, "Failed to open example.pdf\n");
        return 1;
    }

    printf("PDF has %d pages.\n", pdfioFileGetNumPages(pdf));

    // Read the first page (pages are 1-indexed)
    page = pdfioFileGetPage(pdf, 1);
    if (!page) {
        fprintf(stderr, "Failed to read page 1\n");
        pdfioFileClose(pdf);
        return 1;
    }

    // Parse the page content and call our text_cb for each text object
    if (!pdfioPageParseContents(page, text_cb, NULL, NULL, NULL)) {
        fprintf(stderr, "Failed to parse page contents\n");
    }

    // Clean up
    pdfioFileClose(pdf);
    return 0;
}

効率的なストリームベースの読み取り

PDFio は効率性を重視して設計されています。読み取り時に、ファイル全体を一度にメモリにロードしません。その代わり、プルパーシング方式を使用し、ファイルをチャンク単位で処理できるようにします。これは、システムメモリを使い果たすことなく非常に大きな PDF を扱う際に重要です。最初の例にある pdfioPageParseContents 関数は、このストリームベースモデルの好例です。ページのコンテンツストリームを順次読み取り、(テキストコールバックのような)イベントを発行します。

 日本