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);
}
}
}