2017-05-16 4 views
0

Ich habe mehrere Stunden Griff versucht (auf den ersten Blick) sehr einfache Frage in iText, haben einen Blick auf dieses Bild, das mein Problem beschreibt:Ändern über mehrere Zeilen

enter image description here Könnte jemand meinen Code in der Art und Weise bitte ändern es fängt an, die Ausgabe zu emittieren, was ich will?

Hier ist mein Code:

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Element; 
import com.itextpdf.text.Font; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.Phrase; 
import com.itextpdf.text.pdf.BaseFont; 
import com.itextpdf.text.pdf.PdfPCell; 
import com.itextpdf.text.pdf.PdfPTable; 
import com.itextpdf.text.pdf.PdfWriter; 

public class App { 
public static final String DEST = "c:/radek-folder/pdf1iTextZKOUSKA.pdf"; 
protected int horizontalAlignmentCenter = Element.ALIGN_CENTER; 
protected int verticalAlignmentMiddle = Element.ALIGN_MIDDLE; 
protected String fontTypeRegular = "c:/radek-folder/font_sitebook.ttf"; 
protected float fontSizeRegular = 10f; 

public static void main(String[] args) throws IOException, DocumentException { 
    File file = new File(DEST); 
    file.getParentFile().mkdirs(); 
    new App().createPdf(DEST); 
    System.out.println("done"); 
} 

public void createPdf(String dest) throws IOException, DocumentException { 
    float[] columns = { 100, 50, 100, 50, 50, 50, 50, 50, 75, 50, 50, 50 }; 
    int numberOfColumns = columns.length; 
    Document document = new Document(PageSize.A4.rotate(), 36, 36, 36, 36); 
    PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 

    PdfPTable subTableZkouska = new PdfPTable(numberOfColumns); 
    subTableZkouska.setTotalWidth(columns); 
    subTableZkouska.setLockedWidth(true); 

    addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
      verticalAlignmentMiddle, "Brno Špitálka 8 Brno Hájecká 1068/14 CZ5159", 1, 
      2, fontTypeRegular, fontSizeRegular); 

    addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
      verticalAlignmentMiddle, "38", 1, 2, fontTypeRegular, fontSizeRegular); 

    for (int i = 0; i < 19; i++) { 
     addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
       verticalAlignmentMiddle, "38", 1, 1, fontTypeRegular, 
       fontSizeRegular); 
    } 
    addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
      verticalAlignmentMiddle, "38", 1, 1, fontTypeRegular, fontSizeRegular); 

    document.add(subTableZkouska); 
    document.close(); 
} 

private static void addCellToTableCzech(PdfPTable table, int horizontalAlignment, 
     int verticalAlignment, String value, int colspan, int rowspan, 
     String fontType, float fontSize) { 
    BaseFont base = null; 
    try { 
     base = BaseFont.createFont(fontType, BaseFont.CP1250, BaseFont.EMBEDDED); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    Font font = new Font(base, fontSize); 
    PdfPCell cell = new PdfPCell(new Phrase(value, font)); 
    cell.setColspan(colspan); 
    cell.setRowspan(rowspan); 
    cell.setHorizontalAlignment(horizontalAlignment); 
    cell.setVerticalAlignment(verticalAlignment); 
    cell.setBorder(PdfPCell.NO_BORDER); 
    table.addCell(cell); 
} 
} 
+0

Das sieht wie eine identische Frage als http://stackoverflow.com/questions/44002444/itext-how-to-change-rowspan-correctly –

+1

@BrunoLowagie - Ich interpretiere diese Frage nicht als jemand anderen beschuldigen. Die meisten Menschen, vielleicht auch Sie, haben übermäßig viel Zeit mit Dingen verbracht, die sich als trivial erweisen. Übernehmen Sie einfach die Frage und geben Sie eine hilfreiche Antwort, wenn Sie dazu in der Lage sind. – lit

Antwort

1

Sie eine Tabelle mit 12 Spalten erstellen, dann wie folgt aus den Sie hinzufügen Zellen:

// column 1, rows 1 and 3 
addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
     verticalAlignmentMiddle, "Brno Špitálka 8 Brno Hájecká 1068/14 CZ5159", 1, 
     2, fontTypeRegular, fontSizeRegular); 
// column 2, rows 1 and 2 
addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
     verticalAlignmentMiddle, "38", 1, 2, fontTypeRegular, fontSizeRegular); 
// columns 3 to 12, rows 1 and 2 
for (int i = 0; i < 19; i++) { 
    addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
      verticalAlignmentMiddle, "38", 1, 1, fontTypeRegular, 
      fontSizeRegular); 
} 
// column 1, row 3 
addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
     verticalAlignmentMiddle, "38", 1, 1, fontTypeRegular, fontSizeRegular); 

Wie dokumentiert, PdfPTable des iText macht nur vollständige Reihen, Daher wird die letzte Zeile ignoriert. Dies steht im Einklang mit dem Screenshot, den Sie über die mit iText erstellte PDF-Datei geteilt haben. Warum behaupten Sie, dass es einen Fehler in iText gibt?

an dem gewünschten Ausgang Sehen, würde ich denken, dass Sie diesen Code haben würden:

// column 1, rows 1 and 2 
addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
     verticalAlignmentMiddle, "Brno Špitálka 8 Brno Hájecká 1068/14 CZ5159", 1, 
     2, fontTypeRegular, fontSizeRegular); 
// columns 2 to 11, rows 1 and 2 
for (int i = 0; i < 19; i++) { 
    addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
      verticalAlignmentMiddle, "38", 1, 1, fontTypeRegular, 
      fontSizeRegular); 
} 
// column 12, rows 1 and 2 
addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
     verticalAlignmentMiddle, "38", 1, 2, fontTypeRegular, fontSizeRegular); 

Fazit: Ich glaube nicht, dass ein Fehler in iText ist, aber ein Fehler im Code. Ich habe weder die Zeit noch die Neigung, deinen Code zu testen. Ich antwortete von meinem Telefon basierend auf was ich sehe. Wenn Sie wollen, dass jemand genauer hinsieht, gibt es immer bezahlte Unterstützung.

+0

Diese Lösung funktioniert nicht für mich. – user7968180

+0

iText ist Open Source. Wenn Sie denken, dass es einen Fehler gibt, können Sie ihn reparieren. –

+0

Also ich glaube, ich war wahr, dass Sie nicht einmal versucht haben, Ihre Lösung zu kompilieren, und jetzt bin ich der Böse, weil ich Ihnen gesagt habe, dass es nicht funktioniert und ich es bereits versucht habe, bevor ich diese Frage gestellt habe. Ok, dann wird mein Chef glücklich sein. – user7968180

0

Bruno hat in seiner Antwort das Problem richtig analysiert: Es macht hier keinen Sinn, die zweite Zelle gleich nach der ersten mit der zweiten zu ergänzen, da sie dann offensichtlich in der zweiten Spalte, nicht in der zwölften Spalte gezeichnet wird die Operation.

Seine Lösung, die er offline erstellt, ist jedoch falsch.

Wenn die zweite Zelle mit rowspan 2 in der zwölften Spalte angezeigt werden soll, muss sie als zwölfte Zelle hinzugefügt werden! (Unter der Annahme, dass alle beteiligten Zellen haben Column 1, ..., ist, dass, wie im Fall bei der Hand.)

So:

public void createPdfFixed(String dest) throws IOException, DocumentException { 
    float[] columns = { 100, 50, 100, 50, 50, 50, 50, 50, 75, 50, 50, 50 }; 
    int numberOfColumns = columns.length; 
    Document document = new Document(PageSize.A4.rotate(), 36, 36, 36, 36); 
    PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 

    PdfPTable subTableZkouska = new PdfPTable(numberOfColumns); 
    subTableZkouska.setTotalWidth(columns); 
    subTableZkouska.setLockedWidth(true); 

    // cell 1 with rowspan 2 >> column 1 
    addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
      verticalAlignmentMiddle, "Brno Špitálka 8 Brno Hájecká 1068/14 CZ5159", 1, 
      2, fontTypeRegular, fontSizeRegular); 

    // cells 2-11 with rowspan 1 >> column 2-11 upper row 
    for (int i = 2; i < 12; i++) { 
     addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
       verticalAlignmentMiddle, "38", 1, 1, fontTypeRegular, 
       fontSizeRegular); 
    } 

    // cell 12 with rowspan 2 >> column 12 
    addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
      verticalAlignmentMiddle, "38", 1, 2, fontTypeRegular, fontSizeRegular); 

    // cells 13-22 with rowspan 1 >> column 2-11 lower row 
    for (int i = 13; i < 23; i++) { 
     addCellToTableCzech(subTableZkouska, horizontalAlignmentCenter, 
       verticalAlignmentMiddle, "38", 1, 1, fontTypeRegular, 
       fontSizeRegular); 
    } 

    document.add(subTableZkouska); 
    document.close(); 
} 

(UseRowspan Methode createPdfFixed durch Test verwendet testUseRowspanLikeUser7968180Fixed)

+0

danke, aber ich habe es schon repariert, also werde ich es nicht mehr überprüfen :-) Aber danke für deine Mühe. – user7968180

0

I habe die Art und Weise, wie iText-Tabelle erstellt, nicht richtig verstanden. Dies führte dazu, dass ich es nicht richtig berechnen konnte:

enter image description here Als ich realisiert hatte, was in diesem Bild ist, habe ich es bereits reibungslos geschafft. Es war nur meine Schuld, Entschuldigung.

Verwandte Themen