Создание PDF с нестандартным размером в android с помощью PdfDocument - PullRequest
4 голосов
/ 18 января 2020

PdfDocument - это класс, который позволяет создавать PDF-файлы из Android представления. Вы просто добавляете вид в PdfDocument, а затем сохраняете PDF в память.

Однако я не хотел бы добавлять вид, который уже отображается на экране, поскольку такой вид подходит только для смартфона. экраны, и я хочу создать PDF-документ для принтеров.

Поэтому я хочу передать вид без рендеринга. Хотя я, конечно, могу это сделать, как будут решаться размеры и пропорции? Как я могу контролировать это в своем PDF-файле?

ОБНОВЛЕНИЕ:

Следуя приведенному ниже ответу от clotodex, я сделал:

    LayoutInflater inflater = getLayoutInflater();
    View linearview;
    linearview = inflater.inflate(R.layout.printed_order,
                                  findViewById(android.R.id.content),
                                  false);

    PdfDocument document = new PdfDocument();
    PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2480, 3508, 0).create();
    PdfDocument.Page page = document.startPage(pageInfo);

    linearview.draw(page.getCanvas());
    document.finishPage(page);

    OutputStream outStream;
    File file = new File(getExternalFilesDir(null), "pedido.PDF");

    try {
        outStream = new FileOutputStream(file);
        document.writeTo(outStream);
        document.close();
        outStream.flush();
        outStream.close();

но я получить пустой PDF. Если я выполняю

View view = findViewById(android.R.id.content);
view.draw(page.getCanvas());

вместо

linearview.draw(page.getCanvas()); 

, я получаю действие, в котором я участвую, что подтверждает, что все верно, за исключением представления, которое я пытаюсь распечатать .

Ответы [ 3 ]

3 голосов
/ 23 января 2020

Посмотрите на этот вопрос Отобразите представление вне экрана в android.

В Android измерения для представления даны родительским макетом. Это означает, что вы можете создать новый макет с желаемыми измерениями и накачать свой вид с помощью attachToRoot=false и root=your_new_layout.

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

0 голосов
/ 05 февраля 2020

Я использовал PrintHelper Вы можете найти его документ здесь

public void print() {
    if(PrintHelper.systemSupportsPrint()){
        final Bitmap bm;
        try {
              bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
              bm.eraseColor(Color.WHITE);// otherwise it will be trans
              final Canvas canvas = new Canvas(bm);
              drawOn(canvas)// draw on canvas
        }catch (OutOfMemoryError er) {
              // out of memory error
              return;
        }
        if(bm == null) return;
        final PrintHelper printHelper = new PrintHelper(getContext());
        printHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT);
        printHelper.printBitmap("fileName", bm, new PrintHelper.OnPrintFinishCallback() {
                @Override
                public void onFinish() {
                        bm.recycle();
                }
            });

    }else{
            // print not supported
    }
}
0 голосов
/ 18 января 2020

Я думаю, что если вы хотите печатать только в PDF, вы можете использовать PrintManager API. для подробностей, вы можете увидеть это API .

, вот пример кода для pdf.

// method for PrintAdapter
override fun onLayout(
        oldAttributes: PrintAttributes?,
        newAttributes: PrintAttributes,
        cancellationSignal: CancellationSignal?,
        callback: LayoutResultCallback,
        extras: Bundle?
) {
    // Create a new PdfDocument with the requested page attributes
    pdfDocument = PrintedPdfDocument(activity, newAttributes)
    // Compute the expected number of printed pages
    val pages = computePageCount(newAttributes)
    if (pages > 0) {
        // Return print information to print framework
        PrintDocumentInfo.Builder("print_output.pdf")
                .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
                .setPageCount(pages)
                .build()
                .also { info ->
                    // Content layout reflow is complete
                    callback.onLayoutFinished(info, true)
                }
    } else {
        // Otherwise report an error to the print framework
        callback.onLayoutFailed("Page count calculation failed.")
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...