Page reflow (Reflow)
The page reflow function automatically rearranges page content when the page size changes. This feature is of great use to applications that need to display PDF documents on output devices of different sizes. Page reflow eliminates the need for applications to account for different device sizes. Foxit PDF SDK provides APIs to create, render, release Reflow pages, and access the properties of Reflow pages.
Create a Reflow page and render it as a bitmap file
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("@fuxinsoft/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);
...go
import (
. “foxit.com/fsdk”
)
...
# Assuming PDFDoc doc has been loaded.
page := doc.GetPage(0)
# Parse PDF page.
page.StartParse(PDFPageE_ParsePageNormal)
reflow_page := NewReflowPage(page)
# Set some arguments used for parsing the reflow page.
reflow_page.SetLineSpace(0)
reflow_page.SetZoom(100)
reflow_page.SetParseFlags(ReflowPageE_Normal)
# Parse reflow page.
reflow_page.StartParse()
# 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 := NewRenderer(bitmap, false)
matrix := reflow_page.GetDisplayMatrix(0, 0)
renderer.StartRenderReflowPage(reflow_page, matrix)