2015年11月5日

回転を考慮したPDFの(たとえば)CropBoxを取得したいのだそうだ.さすがのpdftexも回転の値を取得することは難しそうなので,MuPDFを見てみた.page構造体にはrotateというメンバがあるので,それでよさそう.というわけでpdftexのコードもこんなんにした.(動かしていないので間違っているかも.)rotate=90の場合.

\pdfpagebox=0\relax
\message{^^J1bp=\the\dimexpr 1bp\relax^^J}
\newdimen\dimtop\newdimen\dimleft\newdimen\dimbottom\newdimen\dimright
\catcode37=12\relax
\def\space{ }
\pdfximage page 1{in.pdf}
\dimleft=\pdfximagebbox\pdflastximage1\relax
\dimbottom=\pdfximagebbox\pdflastximage2\relax
\dimright=\pdfximagebbox\pdflastximage3\relax
\dimtop=\pdfximagebbox\pdflastximage4\relax
\pdfximage page 1 mediabox{in.pdf}
\message{^^J%%BoundingBox: \the\dimexpr\dimbottom - \pdfximagebbox\pdflastximage2\relax \space\the\dimexpr\pdfximagebbox\pdflastximage3 - \dimright\relax \space\the\dimexpr\dimtop - \pdfximagebbox\pdflastximage2\relax \space\the\dimexpr\pdfximagebbox\pdflastximage3 - \dimleft\relax^^J}
\bye

MuPDFの構造体をさらに眺めると「mediabox」というメンバがあるのだが,これはCropBoxが入っている.しかしその取得を真似ると他のBoxも取得できる.たとえばMediaBoxがほしい時は次の通り.

auto context = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
auto doc = ::pdf_open_document(context,"in.pdf");
auto page = ::pdf_load_page(doc,1);
fz_rect rect;
::pdf_to_rect(context, pdf_lookup_inherited_page_item(doc, page->me, "MediaBox"), &rect);

これでrectにMediaBoxが入る.他のBoxも同様だが,書かれている生の値が入るので,もしCropBoxがなかったらMediaBoxを取得という処理は自分で書くことになる.fz_is_empty_rect(&rect)でBoxがとれたか判定できるようだ.(本当にBoxが空だったらどうなるんだろう…….)

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です