🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3703閲覧

poppler を用いて、win10, Virtual Studio 2019, C++ で PDF ファイルを画像に変換したい

TAKASE_Hiroyuki

総合スコア21

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/12/25 22:01

編集2019/12/26 00:32

#環境
window10 で、 Virtual Studio 2019 の C++ を用いて、スタンドアローン・アプリを作ろうとしています。PDF ファイルを読み込んで、それぞれのページを画像データに変換し、その後、処理したいと考えています。当面は「画像化」だけが必要で、文字データ等は必要ありません。

本件は、
https://teratail.com/questions/231547
に続くものです。さまざまなヒントを頂き、ありがとうございました。
さまざまなページを参照し、とりあえず poppler で試してみようと考えた次第です。

・popplerの入手先
http://blog.alivate.com.au/poppler-windows/
http://blog.alivate.com.au/wp-content/uploads/2018/10/poppler-0.68.0_x86.7z

・解凍ソフト
https://sevenzip.osdn.jp/
https://ja.osdn.net/dl/sevenzip/7z1900-x64.exe/

解凍したファイルは、次のフォルダにあります。
C:\hoge\poppler-0.68.0_x86\

具体的には、
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\bin
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\include
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\lib
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\share

などです。このうち、次のフォルダには dll ファイルがあります。
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\bin

freetype6.dll
jpeg62.dll
libcairo-2.dll
libexpat-1.dll
libfontconfig-1.dll
libgcc_s_dw2-1.dll
libpixman-1-0.dll
libpng16-16.dll
libpoppler-79.dll
libpoppler-cpp-0.dll
libstdc++-6.dll
libtiff3.dll
zlib1.dll

このフォルダの dllファイルは、これで全部です。

#テスト用のプログラム

Visual Studio 2019 で、

⇒ 新しいプロジェクトの作成
⇒ Windows デスクトップアプリケーション C++
プロジェクト名「poppler_test」
場所「C:\hoge\」
ソリューション名「poppler_test」

として作成しました。

・フォルダの設定
プロジェクト ⇒ poppler_testのプロバティ⇒ VC++ディレクトリ
⇒ インクルードディレクトリ
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\include

なお、
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\include\poppler\cpp
というフォルダには、poppler-document.h や poppler-version.h などのファイルが格納されています。

インクルードディレクトリ

プロジェクト ⇒ poppler_testのプロバティ⇒ VC++ディレクトリ
⇒ ライブラリディレクトリ
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\bin
C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\lib

ライブラリディレクトリ

プロジェクト ⇒ poppler_testのプロバティ⇒ リンカー ⇒ 入力
⇒ 追加の依存ファイル
freetype6.dll
jpeg62.dll
libcairo-2.dll
libexpat-1.dll
libfontconfig-1.dll
libgcc_s_dw2-1.dll
libpixman-1-0.dll
libpng16-16.dll
libpoppler-79.dll
libpoppler-cpp-0.dll
libstdc++-6.dll
libtiff3.dll
zlib1.dll

追加の依存ファイル

#ソース・ファイル
上のテストファイルに、一行だけ追加しました。つまり

C++

1#include "poppler/cpp/poppler-version.h"

を追加しました。ソース・ファイルの全体は、次のとおりです。

C++

1// poppler_test.cpp : アプリケーションのエントリ ポイントを定義します。 2// 3 4#include "framework.h" 5#include "poppler_test.h" 6#include "poppler/cpp/poppler-version.h" 7 8#define MAX_LOADSTRING 100 9 10// グローバル変数: 11HINSTANCE hInst; // 現在のインターフェイス 12WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト 13WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 14 15// このコード モジュールに含まれる関数の宣言を転送します: 16ATOM MyRegisterClass(HINSTANCE hInstance); 17BOOL InitInstance(HINSTANCE, int); 18LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 19INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 20 21int APIENTRY wWinMain(_In_ HINSTANCE hInstance, 22 _In_opt_ HINSTANCE hPrevInstance, 23 _In_ LPWSTR lpCmdLine, 24 _In_ int nCmdShow) 25{ 26 UNREFERENCED_PARAMETER(hPrevInstance); 27 UNREFERENCED_PARAMETER(lpCmdLine); 28 29 // TODO: ここにコードを挿入してください。 30 31 // グローバル文字列を初期化する 32 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 33 LoadStringW(hInstance, IDC_POPPLERTEST, szWindowClass, MAX_LOADSTRING); 34 MyRegisterClass(hInstance); 35 36 // アプリケーション初期化の実行: 37 if (!InitInstance (hInstance, nCmdShow)) 38 { 39 return FALSE; 40 } 41 42 HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_POPPLERTEST)); 43 44 MSG msg; 45 46 // メイン メッセージ ループ: 47 while (GetMessage(&msg, nullptr, 0, 0)) 48 { 49 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 50 { 51 TranslateMessage(&msg); 52 DispatchMessage(&msg); 53 } 54 } 55 56 return (int) msg.wParam; 57} 58 59 60 61// 62// 関数: MyRegisterClass() 63// 64// 目的: ウィンドウ クラスを登録します。 65// 66ATOM MyRegisterClass(HINSTANCE hInstance) 67{ 68 WNDCLASSEXW wcex; 69 70 wcex.cbSize = sizeof(WNDCLASSEX); 71 72 wcex.style = CS_HREDRAW | CS_VREDRAW; 73 wcex.lpfnWndProc = WndProc; 74 wcex.cbClsExtra = 0; 75 wcex.cbWndExtra = 0; 76 wcex.hInstance = hInstance; 77 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_POPPLERTEST)); 78 wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); 79 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 80 wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_POPPLERTEST); 81 wcex.lpszClassName = szWindowClass; 82 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 83 84 return RegisterClassExW(&wcex); 85} 86 87// 88// 関数: InitInstance(HINSTANCE, int) 89// 90// 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します 91// 92// コメント: 93// 94// この関数で、グローバル変数でインスタンス ハンドルを保存し、 95// メイン プログラム ウィンドウを作成および表示します。 96// 97BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 98{ 99 hInst = hInstance; // グローバル変数にインスタンス ハンドルを格納する 100 101 HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 102 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); 103 104 if (!hWnd) 105 { 106 return FALSE; 107 } 108 109 ShowWindow(hWnd, nCmdShow); 110 UpdateWindow(hWnd); 111 112 return TRUE; 113} 114 115// 116// 関数: WndProc(HWND, UINT, WPARAM, LPARAM) 117// 118// 目的: メイン ウィンドウのメッセージを処理します。 119// 120// WM_COMMAND - アプリケーション メニューの処理 121// WM_PAINT - メイン ウィンドウを描画する 122// WM_DESTROY - 中止メッセージを表示して戻る 123// 124// 125LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 126{ 127 switch (message) 128 { 129 case WM_COMMAND: 130 { 131 int wmId = LOWORD(wParam); 132 // 選択されたメニューの解析: 133 switch (wmId) 134 { 135 case IDM_ABOUT: 136 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); 137 break; 138 case IDM_EXIT: 139 DestroyWindow(hWnd); 140 break; 141 default: 142 return DefWindowProc(hWnd, message, wParam, lParam); 143 } 144 } 145 break; 146 case WM_PAINT: 147 { 148 PAINTSTRUCT ps; 149 HDC hdc = BeginPaint(hWnd, &ps); 150 // TODO: HDC を使用する描画コードをここに追加してください... 151 EndPaint(hWnd, &ps); 152 } 153 break; 154 case WM_DESTROY: 155 PostQuitMessage(0); 156 break; 157 default: 158 return DefWindowProc(hWnd, message, wParam, lParam); 159 } 160 return 0; 161} 162 163// バージョン情報ボックスのメッセージ ハンドラーです。 164INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 165{ 166 UNREFERENCED_PARAMETER(lParam); 167 switch (message) 168 { 169 case WM_INITDIALOG: 170 return (INT_PTR)TRUE; 171 172 case WM_COMMAND: 173 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 174 { 175 EndDialog(hDlg, LOWORD(wParam)); 176 return (INT_PTR)TRUE; 177 } 178 break; 179 } 180 return (INT_PTR)FALSE; 181}

#エラーメッセージ

1>------ ビルド開始: プロジェクト: poppler_test, 構成: Debug Win32 ------
1>poppler_test.cpp
1>C:\hoge\poppler_test\poppler_test\poppler_test.cpp(6,10): fatal error C1083: include ファイルを開けません。'poppler/cpp/poppler-version.h':No such file or directory
1>プロジェクト "poppler_test.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

このエラーメッセージは、x64 でビルドするようにしたところ、次のようなものに変わりました。

1>------ ビルド開始: プロジェクト: poppler_test, 構成: Debug x64 ------
1>C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\bin\freetype6.dll : fatal error LNK1107: ファイルが無効であるか、または壊れています: 0x308 を読み取れません。
1>プロジェクト "poppler_test.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

#お願い

直接的には、include ディレクトリの設定が間違っているのだろうと思います。いろいろと試してみたのですが、うまくいきません。

また、そもそも、poppler を C++ で使用するための設定は、上のとおりでよろしいのでしょうか。

御多用のところ大変恐縮ですが、御回答いただければ幸いです。

#追記

SHOMI様 からコメントをいただき、x64 でビルドしたところ、別のエラーメッセージが表示されました。

1>------ ビルド開始: プロジェクト: poppler_test, 構成: Debug x64 ------
1>C:\hoge\poppler-0.68.0_x86\poppler-0.68.0\bin\freetype6.dll : fatal error LNK1107: ファイルが無効であるか、または壊れています: 0x308 を読み取れません。
1>プロジェクト "poppler_test.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

そこで、上の「エラーメッセージ」の項目に、このことを書かせていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

画像とビルドログをみる限りではx64のプロパティページに設定し、ビルドはWin32で実行しています。
Win32のプロパティページに設定してください。

投稿2019/12/26 00:22

SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TAKASE_Hiroyuki

2019/12/26 00:28

御回答いただき、ありがとうございました。 まず、ビルドを x64 で行うように変更しました。 その結果、エラーメッセージが変わりました。 そのことについて、追記します。
SHOMI

2019/12/26 00:48

・x86(Win32)のdllをダウンロードしているなのになぜx64ビルドしているのでしょうか ・追加の依存ファイルに指定するのはdllではなくlibです ・この圧縮ファイル内のライブラリはMinGW用で、VC用のlibは含まれていませんね  dumpbinとlibコマンドでlibファイルを作れば動くかもしれませんが
SHOMI

2019/12/26 00:54

配布サイトにもMinGWと書かれていますね。 MSVC isn’t very well supported, these days the download is based off MinGW
TAKASE_Hiroyuki

2019/12/26 00:55

御回答いただき、ありがとうございました。 なるほど、私がダウンロードしたのは、x86(Win32) 用だったんですね。そのことが、まず分かっていませんでした。ありがとうございました。ご指摘のとおり、win32 のプロパティページに記載し、ビルドも x86 で行うようにします。また、dumbin と lib コマンドで lib ファイルを作る方法について、検索してみます。ありがとうございました。
SHOMI

2019/12/26 01:10

>dumpbinとlibコマンドでlibファイルを作れば動くかもしれませんが ヘッダファイルをのぞいてみましたが無理そうですね。 それと、上記サイトのリンク先にもっと新しいバージョンが置いてありましたよ。 VCでもビルドできるようです。 https://poppler.freedesktop.org/
TAKASE_Hiroyuki

2019/12/26 01:17

ありがとうございます。 もう一度、イチからやりなおしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問