93226


### やりたいこと

  * libvipsの `vips copy`コマンドでPDFを画像化する際に、注釈を表示したい。
  * レンダーはpdfiumを使用したい。

### 試したコマンド

  * libvipsをインストール

[code]

    export PREFIX=/usr/local/vips
    export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
    export LD_LIBRARY_PATH=$PREFIX/lib
    export PATH=$PATH:$PREFIX/bin
    
    WORKDIR=/usr/local/src
    VIPS_URL=https://github.com/libvips/libvips/releases/download
    PDFIUM_URL=https://github.com/bblanchon/pdfium-binaries/releases/download/chromium
    
    PDFIUM_VERSION=5351
    VIPS_VERSION=8.13.2
    
    # 関連ライブラリをインストール
    yum install -y \
        libpng-devel \
        poppler-glib-devel \
        glib2-devel \
        libjpeg-devel \
        expat-devel \
        zlib-devel \
        orc-devel \
        lcms2-devel \
        libexif-devel \
        libgsf-devel
    
    # pdftoppm
    yum install -y poppler-utils
    
    cd $WORKDIR
    
    ## install PDFIUM
    mkdir pdfium-$PDFIUM_VERSION \
      && cd pdfium-$PDFIUM_VERSION \
      && wget $PDFIUM_URL/$PDFIUM_VERSION/pdfium-linux-x64.tgz
    mkdir -p $PREFIX/lib/pkgconfig \
      && cd $PREFIX \
      && tar xf $WORKDIR/pdfium-$PDFIUM_VERSION/pdfium-linux.tgz \
      && echo "prefix=$PREFIX" >> lib/pkgconfig/pdfium.pc \
      && echo "exec_prefix=\${prefix}" >> lib/pkgconfig/pdfium.pc \
      && echo "libdir=\${exec_prefix}/lib" >> lib/pkgconfig/pdfium.pc \
      && echo "includedir=\${prefix}/include" >> lib/pkgconfig/pdfium.pc \
      && echo "Name: pdfium" >> lib/pkgconfig/pdfium.pc \
      && echo "Description: pdfium" >> lib/pkgconfig/pdfium.pc \
      && echo "Version: $PDFIUM_VERSION" >> lib/pkgconfig/pdfium.pc \
      && echo "Requires: " >> lib/pkgconfig/pdfium.pc \
      && echo "Libs: -L\${libdir} -lpdfium" >> lib/pkgconfig/pdfium.pc \
      && echo "Cflags: -I\${includedir}" >> lib/pkgconfig/pdfium.pc
    
    ## install libvips
    wget $VIPS_URL/v$VIPS_VERSION/vips-$VIPS_VERSION.tar.gz \
      && tar xf vips-$VIPS_VERSION.tar.gz \
      && cd vips-$VIPS_VERSION \
      && ./configure --prefix $PREFIX \
      && make V=0 \
      && make install
    
[/code]

  * PDFを画像化

[code]

    vips copy intput.pdf[page=1,dpi=192]  output_1_.jpg[Q=100]
    
[/code]

### 試した結果

  * PDFの内容がjpeg画像として保存された。(OK)
  * ただし、PDFには存在する注釈が、jpeg画像には表示されていなかった。(NG)

[![ghostscriptで変換すると注釈が表示される](https://i.stack.imgur.com/luiax.png)](https://i.stack.imgur.com/luiax.png)  
[![libvipsで変換すると注釈が表示されない](https://i.stack.imgur.com/9lwJ6.png)](https://i.stack.imgur.com/9lwJ6.png)


CC BY-SA 4.0
2023-01-06T05:13:43.577
93210
2023-01-07T08:08:55.783
56414
question
pdf
libvipsのcopyコマンドでPDFを画像化する際に、注釈を表示させる方法を知りたい


## 結論

次のように libvips をコンパイルすれば、PDFを画像化する際に注釈を表示できます。  
4行目(sed -z ~)を追加してします。

[code]

    wget $VIPS_URL/v$VIPS_VERSION/vips-$VIPS_VERSION.tar.gz \
      && tar xf vips-$VIPS_VERSION.tar.gz \
      && cd vips-$VIPS_VERSION \
      && sed -z -i 's/FPDF_RenderPageBitmap[^;]*;/FPDF_RenderPageBitmap( bitmap, pdf->page, 0, 0, rect.width, rect.height, 0, 1 );/' ./libvips/foreign/pdfiumload.c \
      && ./configure --prefix $PREFIX \
      && make V=0 \
      && make install
    
[/code]

libvips は PDFium の FPDF_RenderPageBitmap 関数を実行する際に、注釈を表示しないオプションを指定しています。
上は注釈を表示するオプションにソースコードを書き換えてコンパイルしています。

## PDFium

FPDF_RenderPageBitmap関数の最後の引数に、RenderFlags.FPDF_ANNOT=1
を指定して実行すると、PDFの注釈を表示するようです。

[code]

    public static void FPDF_RenderPageBitmap(
        IntPtr bitmap,
        IntPtr page,
        int start_x,
        int start_y,
        int size_x,
        int size_y,
        PageRotate rotate,
        RenderFlags flags
    )
    
[/code]

<https://pdfium.patagames.com/help/html/M_Patagames_Pdf_Pdfium_FPDF_RenderPageBitmap.htm>

## libvips

libvips側のコードを確認すると、最後の引数が 0 になっており、アノテーションを表示しないオプションが指定されています。 最後の引数を 1
に変更することで、目的を達成できます。

libvips/foreign/pdfiumload.c

[code]

    FPDF_RenderPageBitmap( bitmap, pdf->page, 
        0, 0, rect.width, rect.height,
        0, 0 ); 
    
[/code]

<https://github.com/libvips/libvips/blob/976db37f84b5ab2d77e85cf3b123f63f97c35d39/libvips/foreign/pdfiumload.c#L592>

## libvips のコンパイル

[code]

    sed -z -i 's/FPDF_RenderPageBitmap[^;]*;/FPDF_RenderPageBitmap( bitmap, pdf->page, 0, 0, rect.width, rect.height, 0, 1 );/' ./libvips/foreign/pdfiumload.c 
    
[/code]

上のコマンドで、次のように、最後の引数を 0 → 1 に変更しています。

[code]

    FPDF_RenderPageBitmap( bitmap, pdf->page, 
        0, 0, rect.width, rect.height,
        0, 0 ); 
    　　　　　　　↓
    FPDF_RenderPageBitmap( bitmap, pdf->page, 0, 0, rect.width, rect.height, 0, 1 );
    　　　　　　　　
    
[/code]


CC BY-SA 4.0
2023-01-07T08:08:55.783
93226
2023-01-07T08:08:55.783
56412
93210
answer