¿Por qué las imágenes se recortan al convertir imágenes a PDF utilizando la biblioteca iText en android
En mi aplicación quiero convertir las imágenes seleccionadas por el usuario en un solo archivo PDF. Estoy usando la biblioteca iText como lo sugieren muchas personas. El usuario selecciona múltiples imágenes y se crea un pdf con él donde cada imagen es 1 página pdf.
El código que estoy usando es el siguiente
- ¿Cómo podemos abrir archivos como ppt, doc, pps, rtf, etc. en Android?
- Android - Obtener el nombre de archivo original para una descarga asíncrona
- Cómo agregar encabezado y pie de página en pdf dinámico utilizando iTextLibrary?
- Cómo puedo convertir un mapa de bits en formato PDF en android
- Página de PDF de Android para api de imágenes
Document document = new Document(PageSize.A4); try { String path = Environment.getExternalStorageDirectory()+"/PDFile.pdf"; File file= new File(path); if(file.exists()) { } else { file.createNewFile(); } PdfWriter.getInstance(document,new FileOutputStream(path)); document.open(); for(int i =0; i<pdfImage.size();i++) { Image image = Image.getInstance(pdfImage.get(i)); image.scaleAbsolute(PageSize.A4); image.setAbsolutePosition(0, 0); document.add(image); } document.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
El pdf se está generando, pero la imagen se recorta. Sólo la mitad de la imagen es visible, el resto se recorta.
¿Tengo que fijar cualquier cosa para que el pdf adopte al tamaño de la imagen ??
¿O tengo que cambiar o cambiar el tamaño de la imagen para adoptar a pdf tamaño de página?
¡¡Por favor ayuda!! No tengo ni idea de cómo resolver esto ???
- Descargar pdf a través de un navegador web y una vista web
- Lectura de un documento PDF en Android
- ¿Cómo abrir un pdf almacenado en res / raw o carpeta de activos?
- Múltiples hipervínculos sobre una imagen en pdf android
- Invocación de Adobe Reader desde mi aplicación de Android
- Cómo leer archivos .doc, .docx, .xls en android
- Convertir una página Pdf en Bitmap en Android Java
- Reduciendo el tamaño de Pdf creado usando PdfDocument en android
Cuando usted hace esto:
Document document = new Document();
A continuación, crea implícitamente un documento del cual las páginas tienen un tamaño de página conocido como A4. Es decir: una anchura de 595 y una altura de 842 unidades de usuario.
Si agrega imágenes que son más pequeñas, no se recortarán. Si agrega imágenes que son más grandes. Las imágenes serán recortadas …
Si desea que una imagen se ajuste exactamente a una página, tiene dos opciones:
- Adaptar el tamaño de las páginas, o
- Adapte el tamaño de la imagen.
Ambas opciones son equivalentes, ya que iText no cambiará la resolución de las imágenes: todos los píxeles se conservarán.
Opción 1:
Vea mi respuesta a la pregunta: Añadir mapas en iText Java
En esta pregunta, hago esto:
Image img = Image.getInstance(IMG); Document document = new Document(img); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); document.open(); img.setAbsolutePosition(0, 0); document.add(img); document.close();
El objeto Document
acepta un Rectangle
como parámetro. Este Rectangle
define el tamaño de página en unidades de usuario. Como la clase Image
es una subclase de la clase Rectangle
, puedo usar la instancia de Image
como parámetro para crear la instancia de Document
.
Otra opción sería hacer esto:
Rectangle pagesize = new Rectangle(img.getScaledWidth(), img.getScaledHeight()); Document document = new Document(pagesize);
Si el documento tiene páginas diferentes, debe utilizar el método setPageSize()
antes de activar una nueva página.
Opcion 2:
Ver mi respuesta a la pregunta: Backgroundimage en el paisaje y cubrir todo pdf con iTextSharp
El código se ve así (bueno, el código actual es un poco diferente, pero esto también funcionará):
Document document = new Document(PageSize.A4.rotate()); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest)); document.open(); Image image = Image.getInstance(IMAGE); image.scaleAbsolute(PageSize.A4.rotate()); image.setAbsolutePosition(0, 0); document.add(image); document.close();
Aquí tengo páginas con el tamaño A4 en el paisaje, y la escala de la imagen para que se ajuste a la página por completo. Eso es peligroso porque cambia la relación de aspecto de la imagen. Esto puede resultar en imágenes distorsionadas. El reemplazo de scaleAbsolute()
por scaleToFit()
evitará ese problema, pero tendrá algunos márgenes blancos si la relación de aspecto de la imagen es diferente de la relación de aspecto de la página.
Importante: Tenga en cuenta que he utilizado setAbsolutePosition(0, 0);
en ambos casos. Estoy introduciendo esta línea para que la esquina inferior izquierda de la imagen coincida con la esquina inferior izquierda de la página. Si no lo hace, verá un margen hacia abajo y hacia la izquierda, y su imagen será recortada a la parte superior ya la derecha.
- Material Tema Android Action Bar Estilo Generador
- Cómo cambiar el título de la actividad cuando cambia una pestaña (SlidingTabLayout)