#環境
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 スキップ ==========
そこで、上の「エラーメッセージ」の項目に、このことを書かせていただきました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/26 00:28
2019/12/26 00:48
2019/12/26 00:54
2019/12/26 00:55
2019/12/26 01:10
2019/12/26 01:17