2017-10-04 9 views
1

J'ai essayé itextPdf_page_orientation mais le problème est que seule la première page est correcte. Toutes les pages sont imprimées en demi-zone. Voici une image qui vous aidera à comprendre le problème. enter image description hereImpression de plusieurs pages en utilisant le format PDF extensible en orientation paysage

J'ai essayé à la fois de régler le format de la page PdfPage.A4.rotate() et de définir l'événement sur PdfWritter.
Voici le snipet de code.

@Override 
    protected String doInBackground(Void... params) { 
    final String PARENT_PATH = 
    Environment.getExternalStorageDirectory().getPath() + "/.GSTInvoice"; 
    Document document = null; 
    try { 
     File file = new File(PARENT_PATH); 
     if (!file.exists()) { 
      file.mkdirs(); 
     } 
     File pdfFile = new File(file, "last_sales_summary"); 

     document = new Document(); 
     document.setPageSize(PageSize.A4.rotate()); 
     event = new RotateEvent(); 

     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFile)); 
     writer.setPageEvent(event); 
     document.open(); 
     event.setOrientation(PdfPage.LANDSCAPE); 
     taxList = new ArrayList<>(); 

     PdfContentByte cb = writer.getDirectContent(); 
     printPage(document, writer, cb); 

     if (document != null && document.isOpen()) { 
      document.close(); 
     } 
     return pdfFile.getPath(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (document != null && document.isOpen()) { 
      document.close(); 
     } 
    } 
    return null; 
} 


private void printPage(Document document, PdfWriter pdfWriter, PdfContentByte pdfContentByte) throws Exception{ 


    int noOfPages = getNoOfPages(); 
    BaseFont latoLight = BaseFont.createFont("assets/Lato-Light.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
    Font light = new Font(latoLight, 8); 
    for (int i=1;i<=noOfPages;i++) { 
     if (i != 1) { 

      document.newPage(); 
      pdfWriter.setPageSize(PageSize.A4.rotate()); 
      event.setOrientation(PdfPage.LANDSCAPE); 
      document.setPageSize(PageSize.A4.rotate()); 
     } 

     addTopPart(document); 

     addMiddleTable(document, i); 

     if (noOfPages>1) { 
      Paragraph paragraph = new Paragraph(new Phrase("Page " + i + "/" + noOfPages, light)); 
      paragraph.setAlignment(Element.ALIGN_CENTER); 
      paragraph.setSpacingBefore(8f); 
      ColumnText.showTextAligned(pdfContentByte, Element.ALIGN_CENTER, 
        paragraph, 
        (document.right() - document.left())/2 + document.leftMargin(), 
        document.bottom() - 10, 0); 
     } 
     event.setOrientation(PdfPage.LANDSCAPE); 
    } 
} 


Toute entrée sera apprécié

+0

Avez-vous essayé de faire 'event.setOrientation (PdfPage.LANDSCAPE)' avant 'document.open()'? – mkl

+0

Oui, ça ne fonctionne pas. Je pense que l'orientation est bonne, c'est la taille de la page ou la dimension qui cause ce problème. –

+0

Veuillez partager le fichier PDF en question. – mkl

Répondre

1

La seule particularité du PDF est que la première page a une rotation de page de 0 tandis que le second a une rotation de page 90.

Ceci est dû à ce que j'ai laissé entendre dans mon premier commentaire: En faisant event.setOrientation(PdfPage.LANDSCAPE) après document.open() la première page n'est pas tournée par l'écouteur d'événement, seulement tous ceux qui suivent. Autre que cela toutes les pages ont une mediabox d'une page de portrait A4 avec le contenu tourné-remplissant de page.

Comme vous indiquez que changer l'ordre de event.setOrientation et document.open ne change pas le comportement, le gestionnaire d'impression en question semble être bogué.

Vous pouvez essayer de supprimer tous les appels event.setOrientation(PdfPage.LANDSCAPE); cela devrait faire en sorte que toutes les pages deviennent comme la première. Vous pouvez également supprimer tous les paramètres de code et changer de rotation et instancier le document Document à l'aide de new Document(new RectangleReadOnly(842,595)), c'est-à-dire sans aucune rotation du tout; Comme le gestionnaire d'impression ne semble pas gérer la rotation correctement, cela peut également entraîner un comportement souhaité.

Comme l'OP rapporté dans un commentaire,

votre suggestion d'utiliser RectangleReadOnly(842,595) a travaillé.