前回でインストールしたpopplerを使ってQtアプリでpdfファイルを読み込む。
今回はpdfといってもページ=画像ファイルなのでわりと簡単。
#include <poppler/qt4/poppler-qt4.h>
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が出力できる。
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()のdpiのデフォルト引数が72.0だったので、一緒にしたらいいんじゃないかなぁと思ったらうまくいった。
QPrinterのAPIをみるとテキストをセットするようなものはないので、
OCRしたテキストをpdfに埋め込みたい時には多分QPrinterでは無理なんじゃないかな?
きっとHandling PDFにあるようにほかのthird partyライブラリを
使えばできるんだろうけど。今回はまぁこの辺で。