Android PdfDocument上的坐标和剪裁

Android PdfDocument上的坐标和剪裁,android,android-pdf-api,Android,Android Pdf Api,我一直很高兴在Android PDF类PdfDocument中生成一个PDF文档。在对“微妙的”文档感到困惑之后,我猜坐标系是在后记(1/72)中的 这在我的Nexus 10上运行得很好,但当三星S6上的坐标系看起来混乱时,我感到相当惊讶,因此在Nexus 10上,我将文本放置在0,0处,它向下2厘米,宽1厘米,非常适合,但在S6上,它向下4厘米,宽2厘米。此外,底部和右侧分别被剪裁2厘米和1厘米。换句话说,剪裁矩形位于正确的位置,但坐标系似乎已双偏移 我的绘图代码如下所示: c

我一直很高兴在Android PDF类PdfDocument中生成一个PDF文档。在对“微妙的”文档感到困惑之后,我猜坐标系是在后记(1/72)中的

这在我的Nexus 10上运行得很好,但当三星S6上的坐标系看起来混乱时,我感到相当惊讶,因此在Nexus 10上,我将文本放置在0,0处,它向下2厘米,宽1厘米,非常适合,但在S6上,它向下4厘米,宽2厘米。此外,底部和右侧分别被剪裁2厘米和1厘米。换句话说,剪裁矩形位于正确的位置,但坐标系似乎已双偏移

我的绘图代码如下所示:

        canvas.save();
        canvas.translate(0, pagePosition);
        staticLayout.draw(canvas);
        canvas.restore();
其中pagePosition是一个简单的ps计数器,通过测量staticLayout.getHeight()结果中的文本来驱动

要清楚的是,在一个相当复杂的文本、线条图和图像的混合体上,布局是正确的,没有缺点,只是得到了这个依赖于设备的缺点

虫子还是我的大脑

编辑:左边是Nexus,右边是S6

要生成的代码:

 import android.annotation.TargetApi;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.pdf.PdfDocument;
 import android.support.v4.content.ContextCompat;

 import uk.co.spennycycles.pocketcycletech.PocketCycleTechApp;
 import uk.co.spennycycles.pocketcycletech.R;



  @TargetApi(19)

public class TestReport extends PdfDocument {
private static final String TAG = SpennyPdfDocument.class.getSimpleName();
private static final int A4_WIDTH = 595;
private static final int A4_HEIGHT = 842;
private static final int CM = 28;
int pageWidth;
int pageHeight;


public void generateReport() {
PageInfo.Builder pageBuilder = new PageInfo.Builder(A4_WIDTH, A4_HEIGHT, 1);
Rect rect = new Rect(0, 0, A4_WIDTH, A4_HEIGHT);
rect.inset(CM, 2 * CM);
pageBuilder.setContentRect(rect);
PageInfo pageInfo = pageBuilder.create();
Page page = super.startPage(pageInfo);

pageWidth = rect.width();
pageHeight = rect.height();
Canvas canvas = page.getCanvas();

RectF r = new RectF((float) 0, 0, pageWidth, pageHeight);
r.inset(1.0f, 1.0f);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setDither(true);
paint.setStyle(Paint.Style.FILL);

paint.setColor(ContextCompat.getColor(PocketCycleTechApp.getContext(), R.color.lt_gray));
canvas.drawRect(r, paint);

paint.setColor(ContextCompat.getColor(PocketCycleTechApp.getContext(), R.color.black));

paint.setStrokeWidth(2.0f);
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(r, paint);
paint.setStyle(Paint.Style.FILL_AND_STROKE);

canvas.drawLine(r.left, r.top, r.right, r.bottom, paint);
canvas.drawLine(r.right, r.top, r.left, r.bottom, paint);

finishPage(page);
}
}
解决方法:

    currentPage = super.startPage(pageInfo);
    Canvas canvas = currentPage.getCanvas();
    canvas.translate(CM, CM*2);
    canvas.clipRect(0, 0, rect.width(), rect.height());
使画布保持完全相同的状态

    currentPage = super.startPage(pageInfo);
    Canvas canvas = currentPage.getCanvas();
    canvas.translate(CM, CM*2);
    canvas.clipRect(0, 0, rect.width(), rect.height());