Координаты и вырезка на Android PdfDocument

Я с удовольствием делаю документ PDF в классе PDF PDF для Android. После размышлений над "тонкой" документацией я предположил, что система координат была в PostScript (1/72")

private static final int A4_WIDTH = 595;
private static final int A4_HEIGHT = 842;
private static final int CM = 28;
private static final int footer_height = CM;



void startPage() {
    if (currentPage != null) {
        finishPage(currentPage);
    }
    PageInfo.Builder pageBuilder = new PageInfo.Builder(A4_WIDTH, A4_HEIGHT, page++);
    Rect rect = new Rect(0, 0, A4_WIDTH, A4_HEIGHT);
    rect.inset(CM, 2 * CM);
    pageBuilder.setContentRect(rect);
    PageInfo pageInfo = pageBuilder.create();
    pagePosition = 0.0f;
    pageWidth = rect.width();
    pageHeight = rect.height();
    currentPage = super.startPage(pageInfo);
    page_count++;
    if (has_footer)
        putFooter();

}

Это хорошо работало на моем Nexus 10, но я был довольно удивлен, когда на Samsung 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

Левый Нексус - Правый 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);
}
}

1 ответ

Решение

Временное решение:

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

оставляет холст точно в таком же состоянии.

Другие вопросы по тегам