Imprima varias páginas PDF utilizando el marco de impresión de Android 4.4
Quiero pedir ayuda. Quiero imprimir / crear documento pdf. Puedo crear una página pdf y escribir datos a esta página a través de lienzo. El problema es que no sé cómo puedo crear otra página pdf y continuar escribiendo a esta segunda página. Si alguien tiene alguna experiencia voy a ayudar muy completo paso mucho tiempo con esto.
Yo uso esto: https://developer.android.com/reference/android/print/pdf/PrintedPdfDocument.html
- Android 4.4 errores api http?
- Android ActionBar transparente con ActionSherlock en v19
- Creación de una aplicación para Android con targetSdkVersion de 25 y minSdkVersion 19
- Ejecución de múltiples instancias de la misma aplicación en kitkat android
- Alternar los datos móviles de forma programática en Android 4.4.2
Parte de mi código está allí:
private void doPrint(int _docNumber){ docNumber = _docNumber; //get Printmanager instance PrintManager printManager = (PrintManager)this.getSystemService(Context.PRINT_SERVICE); // Set job name, which will be displayed in the print queue String jobName = getString(R.string.app_name) + " dokument"; // Start a print job, passing in a PrintDocumentAdapter implementation // to handle the generation of a print document printManager.print(jobName, new MyPrintDocAdapter(), null); Toast.makeText(getBaseContext(), "Príprava na tlač...", Toast.LENGTH_SHORT).show(); } public class MyPrintDocAdapter extends PrintDocumentAdapter { Context context; private int pageHeight; private int pageWidth; public PdfDocument myPdfDocument; @Override public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { myPdfDocument = new PrintedPdfDocument(context, newAttributes); pageHeight = newAttributes.getMediaSize().getHeightMils()/1000 * 72; pageWidth = newAttributes.getMediaSize().getWidthMils()/1000 * 72; if (cancellationSignal.isCanceled() ) { callback.onLayoutCancelled(); return; } if (totalpages > 0) { PrintDocumentInfo.Builder builder = new PrintDocumentInfo .Builder("Dokument_"+ docNumber + ".pdf") .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .setPageCount(totalpages); PrintDocumentInfo info = builder.build(); callback.onLayoutFinished(info, true); } else { callback.onLayoutFailed("Počet strán je nula."); } } @Override public void onWrite(final PageRange[] pageRanges, final ParcelFileDescriptor destination, final CancellationSignal cancellationSignal, final WriteResultCallback callback) { for (int i = 0; i < totalpages; i++) { if (pageInRange(pageRanges, i)) { PdfDocument.PageInfo newPage = new PdfDocument.PageInfo.Builder(pageWidth, pageHeight, i).create(); PdfDocument.Page page = myPdfDocument.startPage(newPage); if (cancellationSignal.isCanceled()) { callback.onWriteCancelled(); myPdfDocument.close(); myPdfDocument = null; return; } switch (docNumber) { case 1: drawObjednavka(page, i); break; case 2: drawVykaz(page, i); break; default: Toast.makeText(MainActivity.this, "Bad file format",Toast.LENGTH_SHORT).show(); } myPdfDocument.finishPage(page); } } try { myPdfDocument.writeTo(new FileOutputStream(destination.getFileDescriptor())); } catch (IOException e) { callback.onWriteFailed(e.toString()); return; } finally { myPdfDocument.close(); myPdfDocument = null; } callback.onWriteFinished(pageRanges); } private boolean pageInRange(PageRange[] pageRanges, int page) { for (int i = 0; i<pageRanges.length; i++) { if ((page >= pageRanges[i].getStart()) && (page <= pageRanges[i].getEnd())) return true; } return false; } private void drawObjednavka(PdfDocument.Page page, int pagenumber) { int verticalPosY = 0; canvas = page.getCanvas(); pagenumber++; // Make sure page numbers start at 1 Typeface tf = Typeface.create(Typeface.DEFAULT, Typeface.NORMAL); // there you can change type of font family, if needed PF PdfDocument.PageInfo pageInfo = page.getInfo(); Paint paint = new Paint(); paint.setTypeface(tf); paint.setColor(Color.BLACK); paint.setStrokeWidth(1F); //set line thickness paint.setTextSize(20); paint.setTypeface(Typeface.DEFAULT_BOLD); canvas.drawText("Objednávka", DEFAULT_LEFT_MARGIN_X, 30, paint);...
- Desactivar / ocultar completamente la barra de estado en 4.4.2
- Excepción fatal: error desconocido (código 14) no se pudo abrir la base de datos
- API de notificación en el navegador Chrome de Android
- Error de licencia con el emulador de Android 4.4
- En Android KitKat, ¿es posible que una vista de superposición llene toda la pantalla?
- 4.4.4 no está en el gestor SDK de Android
- Ejecutar KitKat Virtual Device en la CPU Intel
- Configuración de la barra de navegación como transparente y atenuada al mismo tiempo
Puesto que usted está pintando directamente a un lienzo, puede calcular el total de totalpages
que necesita. Cuando el usuario selecciona un nuevo tamaño de papel, debe volver a dibujar las páginas de acuerdo con las dimensiones de la página y cómo desea mostrar la página.
Su código es correcto, sólo tiene que calcular el total de totalpages
acuerdo con el tamaño del medio seleccionado por el usuario. Tienes pageWidth
y pageHeight
, y también puedes obtener los márgenes a través de newAttributes.getMinMargins()
. Todos los valores que necesita están en newAttributes
.