当用户浏览大型图纸PDF文件时,常会遇到渲染缓慢或无法打开的问题。通过分块渲染技术,可以将原始PDF文件转换为由多张图片拼接而成的新PDF文件,从而显著提升渲染速度。该方法还支持自定义清晰度调节和抗锯齿等图像处理效果。实现代码如下:
public splitImage throws PDFException {
PDFDoc doc = new PDFDoc("68699708#01.pdf");
{
doc.load(null);
PDFDoc docNew = new PDFDoc();
docNew.load(null);
int step_H = 50;
int step_W = 100;
for (int i = 0; i < doc.getPageCount(); i++)
{
PDFPage page = new PDFPage(doc.getPage(i));
{
page.startParse(0, null, true);
int rotation = page.getRotation();
// page.Normalize();
page.startParse(0, null, false);
float pageW = page.getWidth();
float pageH = page.getHeight();
//
PDFPage pageNew = docNew.insertPage(docNew.getPageCount(), pageW, pageH);
pageNew.startParse(0, null, true);
for (int row = 0; row < page.getHeight() / step_H; row++)
{
for (int col = 0; col < page.getWidth() / step_W; col++)
{
float left = col * step_W;
float bottom = row * step_H;
float right = (col + 1) * step_W > pageW ? pageW : (col + 1) * step_W;
float top = (row + 1) * step_H > pageH ? pageH : (row + 1) * step_H;
RectF rect = new RectF(left, bottom, right, top);
Bitmap bitmap = renderABitmapAtRectF(page, rect, 400, 400);
Image image = new Image();
{
image.addFrame(bitmap);
rect = new RectF(left, bottom, right, top);
pageNew.addImage(image, 0, new PointF(rect.getLeft(), rect.getBottom()), rect.width(), rect.height(), false);
}
}
pageNew.generateContent();
//每渲染完一行,保存查看一下
//docNew.saveAs("暖通平面图(1)_ConvertToBitmap.pdf", 0);
}
}
}
docNew.saveAs("test17.pdf", 0);
}
Library.release();
}
static Bitmap renderABitmapAtRectF(PDFPage page, RectF rectf, int dpiX, int dpiY) throws PDFException {
float w = rectf.width();
float h = rectf.height();
float proX = (float)dpiX / 72;
float proY = (float)dpiY / 72;
int width = (int)(page.getWidth() * proX);
int height = (int)(page.getHeight() * proY);
//float v = rectf.getLeft() * proX;
rectf.setLeft(rectf.getLeft() * proX);
//rectf.right = (rectf.getRight() * proX);
rectf.setRight(rectf.getRight() * proX);
//rectf.bottom = (rectf.bottom * proY);
rectf.setBottom(rectf.getBottom() * proY);
//rectf.top = (rectf.top * proY);
rectf.setTop(rectf.getTop() * proY);
Matrix2D matrix = page.getDisplayMatrix(-1 * (int)rectf.getLeft(), -1 * (int)(height - rectf.getTop()), width, height, 0);
Bitmap bitmap=new Bitmap((int)(rectf.width()), (int)(rectf.height()), e_DIBRgb, null, 0);
bitmap.fillRect(0xFFFFFFFF,null);
Renderer render = new Renderer(bitmap, false);
/* render.setRenderEnhanceThinLines(true);
render.setRenderPathThinLine(true);*/
//开始渲染
render.startRender(page, matrix, null);
return bitmap;
}
实现原理说明:
- 页面分割
将每页按固定尺寸(宽度step_W=100像素,高度step_H=50像素)划分为网格区域,每个区域定义为矩形块(RectF)。
- 图像块渲染
对每个矩形块调用renderABitmapAtRectF方法,将PDF页面局部内容渲染为位图(Bitmap)。
- PDF重构
将所有生成的位图按原始坐标位置插入到新PDF的对应页面中,最终生成优化后的PDF文件。