9
votes

ITEXT - Évitez la dernière ligne de ne pas couper les tables sur la page Split à la page suivante

Je travaille sur IText 5 en utilisant Java. J'ai des pages avec des tables multiples avec des rangées dynamiques. Dans certains cas, le tableau Dernière ligne est divisée dans la page suivante avec l'en-tête suivant. J'utilise setheadErrows () code> et setskipfirstheader () code> pour gérer la poursuite de la page suivante. La dernière ligne a suffisamment d'espace pour s'adapter à la page précédente. Je voudrais adapter cette dernière ligne dans la même page au lieu de la page suivante.

Par exemple, à la page 1, la dernière ligne est divisée dans la première ligne de la page suivante. Au lieu de cela, je voudrais vous adapter cette ligne dans la page 1 alors sauvegardez une page supplémentaire avec tous les blancs. P>

J'ai essayé d'utiliser Setextendlastrow () code>, mais cela ne fonctionne pas. Est-ce que quelqu'un sait comment résoudre ce problème? J'attache un code d'échantillon de travail. P>

public class ProposalItextSplitLastRow {
 public static void main(String[] args) {
    try {
        Document document = new Document();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 14, 14);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("C:/SplitLastRow.pdf"));
        document.open();
        document.setPageSize(PageSize.LETTER);
        document.setMargins(16, 14, 42, 38);

        for (int m = 1; m < 20; m++) {

            int row = 0;
            PdfPTable table = new PdfPTable(1);
            table.setSpacingAfter(0);
            table.setSpacingBefore(0);
            table.setWidthPercentage(100);

            table.setHeaderRows(1);
            table.setSkipFirstHeader(true);
            add(table, "Header Row continued " + m, BaseColor.LIGHT_GRAY, row++);
            add(table, "Header Row normal " + m, BaseColor.LIGHT_GRAY, row++);

            add(table, "Text Row 1 ", BaseColor.WHITE, row++);
            add(table, "Text Row 2 ", BaseColor.WHITE, row++);
            add(table, "Text Row 3 ", BaseColor.WHITE, row++);

            addPadding(table);

            document.add(table);
        }

        document.close();
    } catch (Exception de) {
        de.printStackTrace();
    }
}

private static void add(PdfPTable table, String text, BaseColor color, int row) {
    PdfPCell pdfCellHeader = new PdfPCell();
    pdfCellHeader.setBackgroundColor(color);
    pdfCellHeader.addElement(new Paragraph(new Phrase(text)));
    table.addCell(pdfCellHeader);
}

private static void addPadding(PdfPTable table) {
    PdfPCell cell = new PdfPCell();
    cell.setFixedHeight(2f);
    cell.setBorder(Rectangle.NO_BORDER);
    cell.setColspan(table.getNumberOfColumns());
    table.addCell(cell);
}
}


0 commentaires

3 Réponses :


-1
votes

Vous pouvez faire

table.setSplitRows(false);


1 commentaires

Cette chose ne fonctionnera pas pour garder la table tous ensemble sur une page.



7
votes

Je devais exécuter l'exemple pour comprendre votre question. Vous m'avez confondu en parlant d'un en-tête qui n'est pas un en-tête (les rangées avec «la rangée d'en-tête normale» ne sont pas des rangées d'en-tête!) Et votre référence à SetextendLastrow () n'a pas aidé ( Mentionnant que cette méthode n'a pas de sens pour moi; c'est très déroutant).

Ceci étant dit, la solution à votre problème est un point évident. J'ai réécrit la classe principale: xxx

Assurez-vous de définir un largeur totale au lieu d'un pourcentage largeur , et verrouillage la largeur. Comme documenté (et comme le bon sens vous dit), un objet pdfptable ne connaît pas sa largeur réelle si vous définissez un pourcentage de largeur. Il va sans dire que vous ne pouvez pas calculer la hauteur d'une table qui ne sait pas que c'est la largeur réelle.

puis utilisez getverticalposition () méthode pour obtenir la position actuelle de le curseur et vérifiez si les deux premières lignes correspondent à la page. S'ils ne vont pas à une nouvelle page avant d'ajouter la table. Si vous souhaitez vérifier si la table complète s'adapte, utilisez la méthode gettotalheight () au lieu de la méthode getRowheight () .


4 commentaires

Cela fonctionnait parfaitement :) Merci beaucoup. Votre aide est grandement appréciée. Désolé de déranger avec ma question. Je me luttais depuis quelques semaines. Cela a résolu mon problème avec l'évitant de la première ligne pour couper des tables sur la page Split Split sur Stackoverflow.com/Questtions/16548001/... . Il suffit de savoir pourquoi votre solution ne fonctionne pas avec la table.Sewidthpercenter ().


Vous avez peut-être une idée de savoir comment résoudre mon autre problème de ne pas diviser la dernière ligne en page suivante (pas à la dernière ligne de Widow Orphan). C'est ce que ça se passe avec mon code. Row de l'en-tête 16 Rangée de texte 1 Rangée de texte 2 ----- Pause de page ---- Row de l'en-tête suite 16 Text Row 3 Je cherche une solution pour ne pas avoir de page (Split) et d'imprimer la rangée 3 dans la première page , comme la rangée de l'en-tête normale 16 ligne texte 1 ligne de texte 2 ligne de texte 3


Pourquoi devrais-je répondre à une question de suivi qui est affichée à une réponse qui n'est pas acceptée? Aussi: des questions supplémentaires nécessitent une nouvelle question.


À propos de votre curiosité: le bon sens est suffisant pour comprendre pourquoi la solution ne fonctionne pas avec les pourcentages de largeur, mais j'ai adapté la réponse au cas où cela ne serait pas clair. Si vous ne voulez pas que la ligne finale soit orpheline, vous devez prolonger le test afin qu'il couvre plus de lignes au lieu de la rangée 0 et 1. Par exemple: vous pouvez vérifier si la hauteur totale de la table correspond à la page. . Sinon, vérifiez si la hauteur totale moins la hauteur de la dernière ligne convient. Si c'est le cas, votre dernière ligne sera orpheline et vous devrez décider où diviser la table.



10
votes

vous pouvez table.setkeeprowstogather (true);

table.SetHeadErrows (1) aussi bien qu'on le long

setkeeprowstogather () vérifie s'il peut conserver toutes les lignes de la page, mais divise les lignes au cas où la table couvre plusieurs pages. Dans ce cas, SetHeadErrows (1) mettra à nouveau les rangées d'en-tête dans la page suivante.


1 commentaires

Merci pour ton aide! Cela a fonctionné pour moi table.setkeeprowstogather (true);, mais dans ma version iText (5.5.5), cette fonction n'existe pas: il est en réalité que c'est contrepartie de la table.Seeptogether (true);