PdfDocument - вырезать страницу в конце макета - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю файл PDF с помощью класса Android PdfDocument .Я надуваю макет из файла XML ( LinearLayout внутри ConstraintLayout ), который затем завершается во время выполнения путем добавления новых строк с внешними данными.

Проблема в том, что выходной pdf может быть очень длинным или коротким.Я хотел бы избежать указания высоты страницы, прежде чем раздувать макет.Тем не менее, я не могу найти решение для измерения высоты макета, прежде чем добавить его на страницу

Это фактический код:

PdfDocument document = new PdfDocument();

//set page width and height
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(227,992, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);

//inflating the layout
View v = getLayoutInflater().inflate(R.layout.rapportino, null);

//add data to layout
//...

//measure the layout, draw it and finish page
int measureWidth = View.MeasureSpec.makeMeasureSpec(page.getCanvas().getWidth(), View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(page.getCanvas().getHeight(), View.MeasureSpec.EXACTLY);
v.measure(measureWidth, measuredHeight);
v.layout(0, 0, measureWidth, measuredHeight);
v.draw(page.getCanvas());
document.finishPage(page);

//write to file..

Есть ли способ создатьpdf в зависимости от высоты просмотра?

РЕДАКТИРОВАТЬ: это макет, который я раздуваю

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/rapportino_indirizzo_textview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:gravity="end"
            android:textColor="#000000"
            android:textSize="@dimen/rapportino_global_textsize" />

        <!-- 
            other textview, linearlayout and imageview 
            ..
            ..  
        -->

    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

1 Ответ

0 голосов
/ 14 февраля 2019

Итак, я решил с довольно странным решением.Поскольку добавление макета в представление приводит к вычислению высоты, я создал представление невидимое в упражнении, в котором я создаю PDF (с шириной PDF):

<!-- add this to your activity -->
<LinearLayout
    android:visibility="invisible"
    android:id="@+id/output_pdf_view"
    android:orientation="vertical"
    android:layout_width="226dp"
    android:layout_height="wrap_content" />

Затем я добавил раздутый макет в невидимое представление (после заполнения его внешними данными).С помощью наблюдателя вы можете получить высоту в то время, когда она рассчитывается.

//inflating the layout
View v = getLayoutInflater().inflate(R.layout.rapportino, null);

//add data to layout (rows, images etc.)
//...

//find the invisible view
LinearLayout invisibleOutputPdfView = findViewById(R.id.output_pdf_view);

//add the pdf layout and observe changes
invisibleOutputPdfView.addView(v);
invisibleOutputPdfView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //remove the listener
            invisibleOutputPdfView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            int height = invisibleOutputPdfView.getHeight();
            createPDF(height, ..);
        }
    });

ПРИМЕЧАНИЕ: по некоторым причинам кажется, что существует соотношение 1: 1 между dp и pt в генерации PDF.Так что никаких преобразований не требуется.

...