Kohshi's Blog
2014/02/17
popplerを使ってpdfファイルをQImageに読み込む(おまけにQimageをpdfファイルとして書き出す)
[前回](http://kohshi.blogspot.jp/2014/02/popplerhomebrew.html)でインストールしたpopplerを使ってQtアプリでpdfファイルを読み込む。 今回はpdfといってもページ=画像ファイルなのでわりと簡単。 ```cpp #include
openPdfFile(QString fileName){ Poppler::Document *doc = Poppler::Document::load(fileName); if(doc == 0) return; for(int pageNum = 0; pageNum < doc->numPages(); pageNum++){ Poppler::Page *pdfPage = doc->page(pageNum); QImage image = pdfPage->renderToImage(); // このimageを使って描画処理等を行う // pdfPageは使い終わったらdeleteが必要 delete pdfPage; } // docは使い終わったらdeleteが必要 delete doc; } ``` 一方でpdf出力に関しては、これもテキストを出力するのでなければQt自体がもっているpdf出力を使えるので 以下のようにすればQImageをページいっぱいに描画したpdfが出力できる。 ```cpp exportPagesAsPdf(QString fileName){ // QtはQPrinterをつかってpdfファイル出力ができる QPrinter printer(QPrinter::HighResolution); printer.setOutputFormat(QPrinter::PdfFormat); printer.setPageMargins(0, 0, 0, 0, QPrinter::Point);// margin 0にして縁なしにする printer.setOutputFileName(fileName); const int dpi = 72; printer.setResolution(dpi); QPainter painter; for(int i = 0; i < mPages.size(); i++){ QImage image = mPages[i].image(); // 仮に毎ページサイズが変わってもOKにしてる printer.setPaperSize(image.size(), QPrinter::Point); if(i == 0){ painter.begin(&printer);// 最初のページはnewPage()をいれてはいけないので特別処理 } else{ printer.newPage();// サイズを指定した後にnewPage()を呼ぶとそのサイズのPageが挿入される } painter.drawImage(0, 0, image); } } ``` dpiをなぜ72にしたらいいのか実はちょっとわかってないんだが、[popplerのdocumentのPage::renderToImage()](http://people.freedesktop.org/~aacid/docs/qt4/classPoppler_1_1Page.html)のdpiのデフォルト引数が72.0だったので、一緒にしたらいいんじゃないかなぁと思ったらうまくいった。 QPrinterのAPIをみるとテキストをセットするようなものはないので、 OCRしたテキストをpdfに埋め込みたい時には多分QPrinterでは無理なんじゃないかな? きっと[Handling PDF](http://qt-project.org/wiki/Handling_PDF)にあるようにほかのthird partyライブラリを 使えばできるんだろうけど。今回はまぁこの辺で。
ツイート
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿