Skip to content

PDF 渲染 (Render)

PDF 渲染由福昕 Renderer 图形引擎完成,可将页面渲染到 Bitmap 或平台设备上下文。可通过渲染选项/Flags 控制渲染内容与质量,例如:是否渲染表单与签名、是否启用图像/路径抗锯齿等。

常见渲染场景对应的 API 思路如下:

  • 渲染页面内容与注释:先通过 Renderer.setRenderContentFlags 指定渲染内容,再调用 Renderer.startRender 进行渲染(缩略图场景可用 Renderer.startQuickRender)。
  • 渲染单个注释:使用 Renderer.renderAnnot
  • 渲染到 Bitmap:使用 Renderer.startRenderBitmap
  • 渲染 Reflow 页面:使用 Renderer.startRenderReflowPage

说明(Widget 注释与表单渲染) Widget 注释与表单字段/控件关联。推荐流程是:先渲染页面与本页所有注释(包含 widget);若使用 pdf.interform.Filler 进行表单填写,则渲染聚焦控件时建议使用 pdf.interform.Filler.render(而非 Renderer.renderAnnot)。

如何将指定的 PDF 页面渲染到 bitmap

js
import { image } from '@kit.ImageKit';
import { FoxitRDKNative } from 'foxit_rdk';
import { BusinessError } from '@ohos.base';

class RenderUnit {
  public pixelMap?: image.PixelMap;

  public renderPage(page: FoxitRDKNative.pdf.PDFPage, width: number, height: number): void {

    try {
      if (!page.IsParsed()) {
        class PauseCallBackImpl extends FoxitRDKNative.common.PauseCallback {
          NeedToPauseNow(): boolean {
            return false;
          }
        }

        const progressive = page.StartParse(FoxitRDKNative.pdf.PDFPage.e_ParsePageNormal, new PauseCallBackImpl(), false)
        let state = FoxitRDKNative.common.Progressive.e_ToBeContinued;
        while (state == FoxitRDKNative.common.Progressive.e_ToBeContinued) {
          state = progressive.Continue();
        }
      }

      const w: number = Math.ceil(width);
      const h: number = Math.ceil(height);
      const size: number = w * h * 4;

      const matrix: FoxitRDKNative.common.fxcrt.Matrix2D = page.GetDisplayMatrix(0, 0, w, h, FoxitRDKNative.common.e_Rotation0)
      const color: ArrayBuffer = new ArrayBuffer(size)
      const bitmap: FoxitRDKNative.common.Bitmap =
        new FoxitRDKNative.common.Bitmap(w, h, FoxitRDKNative.common.Bitmap.e_DIBArgb, color, w * 4)
      bitmap.FillRect(0xFFFFFFFF)
      const render: FoxitRDKNative.common.Renderer = new FoxitRDKNative.common.Renderer(bitmap, false);

      class PauseCallBackImpl extends FoxitRDKNative.common.PauseCallback {
        NeedToPauseNow(): boolean {
          return false;
        }
      }

      const progressive = render.StartRender(page, matrix, new PauseCallBackImpl());
      let state = FoxitRDKNative.common.Progressive.e_ToBeContinued;
      while (state == FoxitRDKNative.common.Progressive.e_ToBeContinued) {
        state = progressive.Continue();
      }
      let opts: image.InitializationOptions =
        { editable: false, pixelFormat: image.PixelMapFormat.RGBA_8888, size: { height: h, width: w } }
      image.createPixelMap(color, opts, (error: BusinessError, pixelMap: image.PixelMap) => {
        if (error) {
          console.error('Failed to create pixelMap.');
          return;
        }

        this.pixelMap = pixelMap; / 使用 Image 或者其他组件将 pixelMap 加载到布局上面
        console.log('Succeeded in creating pixelMap.');
      })
    } catch (e) {
      console.error(e);
    }
  }
}