页面重排 (Reflow)
页面重排功能是在页面大小发生变化时自动重排页面内容。该功能对那些需要在不同尺寸的输出设备上显示 PDF 文档的应用程序具有很大的利用价值。页面重排让应用程序无需考虑设备的不同尺寸。福昕 PDF SDK 提供了 APIs 用来创建、渲染、释放 Reflow 页面,以及访问 Reflow 页面的属性。
创建一个 Reflow 页面,并将其渲染为位图文件
c++
#include "include/common/fs_common.h"
#include "include/pdf/fs_pdfdoc.h"
#include "include/pdf/fs_pdfpage.h"
#include "include/pdf/fs_reflowpage.h"
#include "include/common/fs_render.h"
using namespace foxit;
using namespace foxit::common;
using foxit::common::Library;
using namespace pdf;
...
// Assuming PDFDoc doc has been loaded.
PDFPage page = doc.GetPage(0);
// Parse PDF page.
page.StartParse(foxit::pdf::PDFPage::e_ParsePageNormal, NULL, false);
ReflowPage reflow_page(page);
// Set some arguments used for parsing the reflow page.
reflow_page.SetLineSpace(0);
reflow_page.SetZoom(100);
reflow_page.SetParseFlags(ReflowPage::e_Normal);
// Parse reflow page.
reflow_page.StartParse(NULL);
// Get actual size of content of reflow page. The content size does not contain the margin.
float content_width = reflow_page.GetContentWidth();
float content_height = reflow_page.GetContentHeight();
// Assuming Bitmap bitmap has been created.
// Render reflow page.
Renderer renderer(bitmap, false);
foxit::Matrix matrix = reflow_page.GetDisplayMatrix(0, 0);
renderer.StartRenderReflowPage(reflow_page, matrix, NULL);
...
C
#include "include/fs_basictypes_c.h"
#include "include/fs_common_c.h"
#include "include/fs_pdfdoc_c.h"
#include "include/fs_pdfpage_c.h"
#include "include/fs_reflowpage.h"
#include "include/fs_render_c.h"
...
// Assuming FS_PDFDOC_HANDLE doc has been loaded.
FS_PDFPAGE_HANDLE page;
FSDK_PDFDoc_GetPage(doc, 0, &page);
// Parse PDF page.
FS_PROGRESSIVE_HANDLE progressive;
FSDK_PDFPage_StartParse(page, e_FSParseFlagsParsePageNormal, NULL, false, &progressive);
FS_REFLOWPAGE_HANDLE reflow_page;
FSDK_ReflowPage_Create(page, &reflow_page);
// Set some arguments used for parsing the reflow page.
FSDK_ReflowPage_SetLineSpace(reflow_page, 0);
FSDK_ReflowPage_SetZoom(reflow_page, 100);
FSDK_ReflowPage_SetParseFlags(reflow_page, e_FSReflowPageFlagsNormal);
// Parse reflow page.
FS_PROGRESSIVE_HANDLE progressive1;
FSDK_ReflowPage_StartParse(reflow_page, NULL, &progressive1);
// Get actual size of content of reflow page. The content size does not contain the margin.
float content_height;
FSDK_ReflowPage_GetContentHeight(reflow_page, &content_height);
float content_width;
FSDK_ReflowPage_GetContentWidth(reflow_page, &content_width);
// Assuming Bitmap bitmap has been created.
// Render reflow page.
FS_RENDERER_HANDLE renderer;
FSDK_Renderer_Create(bitmap, false, &renderer);
FSMatrix matrix;
FSDK_ReflowPage_GetDisplayMatrix(reflow_page, 0, 0, (int)content_width, (int)content_height, e_FSRotation0, &matrix);
FS_PROGRESSIVE_HANDLE progressive2;
FSDK_Renderer_StartRenderReflowPage(renderer, reflow_page, matrix, NULL, &progressive2);
...
java
import com.foxit.sdk.common.Bitmap;
import com.foxit.sdk.common.Image;
import com.foxit.sdk.common.Renderer;
import com.foxit.sdk.common.fxcrt.Matrix2D;
import com.foxit.sdk.common.fxcrt.PointF;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.common.fxcrt.RectI;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
import com.foxit.sdk.pdf.ReflowPage;
import static com.foxit.sdk.common.Bitmap.e_DIBArgb;
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
import static com.foxit.sdk.pdf.PDFPage.e_ParsePageNormal;
import static com.foxit.sdk.pdf.ReflowPage.e_Normal;
import static com.foxit.sdk.pdf.ReflowPage.e_WithImage;
...
public static void SaveBitmap(Bitmap bitmap, int index, String file_name) throws PDFException {
RectF margin = new RectF(50, 30, 30, 30);
PointF size = new PointF(480, 800);
RectI rect = new RectI(0, 0, (int) size.getX(), (int) margin.getTop());
bitmap.fillRect(0xFFFFFFFF, rect);
rect = new RectI(0, (int) size.getY() - (int) margin.getBottom(), (int) size.getX(), (int) size.getY());
bitmap.fillRect(0xFFFFFFFF, rect);
Image image = new Image();
image.addFrame(bitmap);
String save_path;
String sIndex;
sIndex = "" + index;
save_path = output_path + "reflow" + file_name + sIndex + ".bmp";
image.saveAs(save_path);
}
RectF margin = new RectF(50, 30, 30, 30);
PointF size = new PointF(480, 800);
int nCount = doc.getPageCount();
for (int i = 0; i < nCount; i++) {
PDFPage page = doc.getPage(i);
// Parse PDF page.
page.startParse(e_ParsePageNormal, null, false);
ReflowPage reflow_page = new ReflowPage(page);
// Set some arguments used for parsing the relfow page.
reflow_page.setLineSpace(0);
reflow_page.setScreenMargin((int) margin.getLeft(), (int) margin.getTop(), (int) margin.getRight(), (int) margin.getBottom());
reflow_page.setScreenSize(size.getX(), size.getY());
reflow_page.setZoom(100);
reflow_page.setParseFlags(e_Normal);
// Parse reflow page.
reflow_page.startParse(null);
// Get actual size of content of reflow page. The content size does not contain the margin.
float content_width = reflow_page.getContentWidth();
float content_height = reflow_page.getContentHeight();
// Create a bitmap for rendering the reflow page. The bitmap size contains the margin.
Bitmap bitmap = new Bitmap((int) (content_width + margin.getLeft() + margin.getRight()),
(int) (content_height + margin.getTop() + margin.getBottom()), e_DIBArgb, null, 0);
bitmap.fillRect(0xFFFFFFFF, null);
// Render reflow page.
Renderer renderer = new Renderer(bitmap, false);
Matrix2D matrix = reflow_page.getDisplayMatrix(0, 0);
renderer.startRenderReflowPage(reflow_page, matrix, null);
String file_name = "_single_";
SaveBitmap(bitmap, i, file_name);
}
...
py
import sys
import site
if sys.version_info.major == 2:
_PYTHON2_ = True
else:
_PYTHON2_ = False
if _PYTHON2_:
#replace with the python2 lib path
site.addsitedir('../../../')
from FoxitPDFSDKPython2 import *
else:
from FoxitPDFSDKPython3 import *
...
# Assuming PDFDoc doc has been loaded.
page = doc.GetPage(0)
# Parse PDF page.
page.StartParse(PDFPage.e_ParsePageNormal, None, False)
reflow_page = ReflowPage(page)
# Set some arguments used for parsing the reflow page.
reflow_page.SetLineSpace(0)
reflow_page.SetZoom(100)
reflow_page.SetParseFlags(ReflowPage.e_Normal)
# Parse reflow page.
reflow_page.StartParse(None)
# Get actual size of content of reflow page. The content size does not contain the margin.
content_width = reflow_page.GetContentWidth()
content_height = reflow_page.GetContentHeight()
# Assuming Bitmap bitmap has been created.
# Render reflow page.
renderer = Renderer(bitmap, False)
matrix = reflow_page.GetDisplayMatrix(0, 0)
renderer.StartRenderReflowPage(reflow_page, matrix, None)
objc
#include "FSPDFObjC.h"
...
// Assuming FSPDFDoc doc has been loaded.
...
FSPDFPage* page = [doc getPage:0];
// Parse PDF page.
[page startParse:FSPDFPageParsePageNormal pause:nil is_reparse:NO];
FSReflowPage* reflow_page = [[FSReflowPage alloc] initWithPage:page];
// Set some arguments used for parsing the relfow page.
[reflow_page setLineSpace:0];
[reflow_page setScreenMargin:margin.left top:(int)margin.top right:(int)margin.right bottom:(int)margin.bottom];
[reflow_page setScreenSize:size.x height:size.y];
[reflow_page setZoom:100];
[reflow_page setParseFlags:FSReflowPageNormal];
// Parse reflow page.
[reflow_page startParse:nil];
// Get actual size of content of reflow page. The content size does not contain the margin.
float content_width = [reflow_page getContentWidth];
float content_height = [reflow_page getContentHeight];
// Create a bitmap for rendering the reflow page. The bitmap size contains the margin.
FSBitmap* bitmap = [[FSBitmap alloc] initWithWidth:(int)(content_width + margin.left + margin.right) height:(int)(content_height + margin.top + margin.bottom) format:FSBitmapDIBArgb buffer:nil pitch:0];
[bitmap fillRect:0xFFFFFFFF rect:nil];
// Render reflow page.
FSRenderer* renderer = [[FSRenderer alloc] initWithBitmap:bitmap is_rgb_order:NO];
FSMatrix2D* matrix = [reflow_page getDisplayMatrix:0 offset_y:0];
[renderer startRenderReflowPage:reflow_page matrix:matrix pause:nil];
...
js
const FSDK = require("@foxitsoftware/foxit-pdf-sdk-node");
...
// Assuming PDFDoc doc has been loaded.
let page = doc.GetPage(0);
// Parse PDF page.
page.StartParse(FSDK.PDFPage.e_ParsePageNormal, null, false);
let reflow_page = new FSDK.ReflowPage(page);
// Set some arguments used for parsing the reflow page.
reflow_page.SetLineSpace(0);
reflow_page.SetZoom(100);
reflow_page.SetParseFlags(FSDK.ReflowPage.e_Normal);
// Parse reflow page.
reflow_page.StartParse(null);
// Get actual size of content of reflow page. The content size does not contain the margin.
let content_width = reflow_page.GetContentWidth();
let content_height = reflow_page.GetContentHeight();
// Assuming Bitmap bitmap has been created.
// Render reflow page.
let renderer = new FSDK.Renderer(bitmap, false);
let matrix = reflow_page.GetDisplayMatrix(0, 0,content_width,content_height, FSDK.e_Rotation0);
renderer.StartRenderReflowPage(reflow_page, matrix, null);
csharp
using foxit;
using foxit.common;
using foxit.common.fxcrt;
using foxit.pdf;
...
// Assuming PDFDoc doc has been loaded.
PDFPage page = doc.GetPage(0);
// Parse PDF page.
page.StartParse((int)foxit.pdf.PDFPage.ParseFlags.e_ParsePageNormal, null, false);
ReflowPage reflow_page = new ReflowPage(page);
// Set some arguments used for parsing the reflow page.
reflow_page.SetLineSpace(0);
reflow_page.SetZoom(100);
reflow_page.SetParseFlags((int)ReflowPage.Flags.e_WithImage);
// Parse reflow page.
reflow_page.StartParse(null);
// Get actual size of content of reflow page. The content size does not contain the margin.
float content_width = reflow_page.GetContentWidth();
float content_height = reflow_page.GetContentHeight();
// Assuming Bitmap bitmap has been created.
// Render reflow page.
Renderer renderer = new Renderer(bitmap, false);
Matrix2D matrix = reflow_page.GetDisplayMatrix(0, 0);
renderer.StartRenderReflowPage(reflow_page, matrix, null);
...