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 処理に必要な基本機能を提供します。
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 関数は、このストリームベースモデルの好例です。ページのコンテンツストリームを順次読み取り、(テキストコールバックのような)イベントを発行します。