2016-05-23 1 views
1

iTextにネストしたテーブルを描画しようとすると、すべてを配置する最も簡単な方法だと思いました。誰かがiTextsキャンバスの描画命令を説明できますか?

enter image description here

だから私はすべて(PdfPCellEvents経由)、背景色、および/または脳卒中を持っている別のテーブル内の複数のテーブルを持っています。残念ながら、外側のテーブルのストロークは、内側のテーブルの背景と重なっています。 私は、間違った順序で適用されているか、間違ったセットsaveStateまたはrestoreStateが私のPdfPCellEventsにあると仮定します。

saveStaterestoreStateの正しい使い方を誰にでも教えてもらえますか、どのように背景やストロークを正しい方法で適用するかのヒントを教えてください。ここで

は、ストライプの背景セルを追加するための私のコードです:StripedScaleBackgroundの

PdfPCell scaleBackground = new PdfPCell(); 
scaleBackground.setBorder(Rectangle.NO_BORDER); 
scaleBackground.setVerticalAlignment(Element.ALIGN_TOP); 
scaleBackground.setCellEvent(new StripedScaleBackground(max, scaleHeight)); 

cellLayout方法:

public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] canvases) 
{ 
    PdfContentByte canvas = canvases[PdfPTable.LINECANVAS]; 
    float llx = rect.getLeft(); 
    float lly = rect.getBottom(); 
    float urx = rect.getRight(); 
    float ury = rect.getTop(); 

    // Light scale lines with padding from left 
    canvas.setLineWidth(Constants.BORDER_WIDTH_THIN); 
    canvas.setColorStroke(Colors.LIGHT_GRAY); 

    float paddingLeft = 22f; 
    for (int i = 0; i <= this.maxValue; i++) 
    { 
     canvas.moveTo(llx + paddingLeft, lly + (this.scaleHeight * (i + 1))); 
     canvas.lineTo(urx, lly + (this.scaleHeight * (i + 1))); 
    } 

    // Vertical line 
    canvas.moveTo(llx + (((urx - llx) + paddingLeft)/2), ury); 
    canvas.lineTo(llx + (((urx - llx) + paddingLeft)/2), lly); 
    canvas.stroke(); 

    // Fat line left and right 
    canvas.moveTo(llx, ury); 
    canvas.lineTo(llx, lly); 
    canvas.moveTo(urx, ury); 
    canvas.lineTo(urx, lly); 

    canvas.setLineWidth(0.8f); 
    canvas.setColorStroke(Colors.MEDIUM_GRAY); 
    canvas.stroke(); 

    canvas.saveState(); 
    canvas.restoreState(); 
} 

棒グラフは、各セルは、勾配と境界の細胞イベントを持っているテーブルです。棒グラフは、コードの最初の部分のscaleBackground PdfPCellに添加し、PdfPCellEvents(チャートの黒い部分の一例)以下た:

public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] canvases) 
{ 
    PdfContentByte backgroundCanvas = canvases[PdfPTable.BACKGROUNDCANVAS]; 
    float llx = rect.getLeft(); 
    float lly = rect.getBottom(); 
    float urx = rect.getRight(); 
    float ury = rect.getTop(); 

    // Draw background 

    // Define shading with direction and color 
    PdfShading shading = PdfShading.simpleAxial(this.writer, 
        llx, ury, 
        llx, lly, 
        Colors.BAR_CHART_BLACK_LIGHT, Colors.BAR_CHART_BLACK_DARK); 

    PdfShadingPattern pattern = new PdfShadingPattern(shading); 
    backgroundCanvas.setShadingFill(pattern); 

    // Draw shape with defined shading 
    backgroundCanvas.moveTo(llx, ury); 
    backgroundCanvas.lineTo(llx, lly); 
    backgroundCanvas.lineTo(urx, lly); 
    backgroundCanvas.lineTo(urx, ury); 
    backgroundCanvas.lineTo(llx, ury); 
    backgroundCanvas.fill(); 

    backgroundCanvas.saveState(); 
    backgroundCanvas.restoreState(); 

    // Draw border 
    PdfContentByte lineCanvas = canvases[PdfPTable.LINECANVAS]; 

    float lineWidth = Constants.BORDER_WIDTH_THIN; 
    lineCanvas.setLineWidth(lineWidth); 
    lineCanvas.moveTo(llx, ury - lineWidth); 
    lineCanvas.lineTo(llx, lly); 
    lineCanvas.lineTo(urx, lly); 
    lineCanvas.lineTo(urx, ury - lineWidth); 

    lineCanvas.setColorStroke(BaseColor.BLACK); 
    lineCanvas.stroke(); 

    lineCanvas.saveState(); 
    lineCanvas.restoreState(); 
} 

答えて

0

これは、異なる直接コンテンツの層の順序である:

  • PdfPtable.BASECANVAS - ここには何も配置されません。
  • PdfPtable.BACKGROUNDCANVAS - これは、背景が であるレイヤーです。
  • PdfPtable.LINECANVAS - これは、線が描かれているレイヤーです。
  • PdfPtable.TEXTCANVAS - これは、テキストが移動するレイヤーです。ここに置かれたものは です。

これは「iText in Action - Second Edition」という本から取りました。

saveState()restoreState()についてもお尋ねください。これはChapter 2 of the iText 7 tutorialで説明されています。

まず我々は、我々は状態を変更し、我々は最終的に、我々はに戻るにはrestoreState()メソッドを使用し、描きたいものは何でも線や図形の描画、saveState()方法で現在のグラフィックス状態を保存します元のグラフィックスの状態。 saveState()の後に適用した変更はすべて元に戻されます。これは、複数の値(線幅、色など)を変更したり、元の座標系に戻って逆の変化を計算することが難しい場合に特に便利です。

あなたのコードは私が検査するのはあまりにも長い間でしたが、私は非常にsaveState()/restoreState()があなたの問題の原因になることを疑います。

可能な限りテーブルをネストしないようにしようとします。通常は、colspanとrowspanを使用する方がはるかに簡単です(より効率的です)。

これで問題が解決しない場合は、問題を1つの文で説明してください。

+0

ありがとうございました!私の問題は、背景として使用されているにもかかわらず、私はPdfPtable.LINECANVASをストライプされた背景に使用したことでした。私はそれをPdfPtable.BACKGROUNDCANVASに変更しました。 – odaa

関連する問題