2015-01-06 37 views
0

我得到的com.itextpdf.text.exceptions.IllegalPdfSyntaxException:不平衡保存/恢復狀態運營商異常時,我試圖從j2e Web應用程序生成PDF。com.itextpdf.text.exceptions.IllegalPdfSyntaxException:不平衡保存/恢復狀態運算符

我使用PdfGraphics2D對象來繪製文字和形狀,因爲與其他應用程序同步。

任何人都可以舉手解決這個問題。我無法前進,因爲它是工作了一些時間和某些時候它拋出異常,可能是什麼原因?我正在使用itextpdf-5.2.1.jar。請讓我知道你需要任何信息。

我看看Dispose方法的PdfGraphics2D源代碼,對象是如下

/** 
* @see Graphics#dispose() 
*/ 
@Override 
public void dispose() { 
    if (kid) 
     return; 
    if (!disposeCalled) { 
     disposeCalled = true; 
     cb.restoreState(); 
     cb.restoreState(); 
     if (dg2 != null) { 
      dg2.dispose(); 
      dg2 = null; 
     } 
     if (kids != null) { 
      ByteBuffer buf = new ByteBuffer(); 
      internalDispose(buf); 
      ByteBuffer buf2 = cb.getInternalBuffer(); 
      buf2.reset(); 
      buf2.append(buf); 
     } 
    } 
} 

爲什麼叫了兩聲cb.restoreState();方法。

請讓我知道,如果任何機構知道這個或直接向我解決問題。

感謝 Dhorrairaajj

+0

你爲什麼打電話cb.restoreState();方法兩次。 –

+0

這是一個關於「平衡」調用一對方法的錯誤。您需要考慮更多的代碼,可能會覆蓋對象'cb'的整個生命週期。 – Persixty

+0

*爲什麼'cb.restoreState();'方法調用兩次。* - 查看參數化的'PdfGraphics2D'構造函數,它們調用'cb.saveState()'兩次。因此,'dispose()'也必須調用'cb.restoreState()'兩次。 – mkl

回答

0

@覆蓋 公共無效的Dispose(){

if (kid) 
    return; 
if (!disposeCalled) { 
    disposeCalled = true; 
    //you are calling restoreState() twice. check it 
    cb.restoreState(); 
    cb.restoreState(); 
    if (dg2 != null) { 
     dg2.dispose(); 
     dg2 = null; 
    } 
    if (kids != null) { 
     ByteBuffer buf = new ByteBuffer(); 
     internalDispose(buf); 
     ByteBuffer buf2 = cb.getInternalBuffer(); 
     buf2.reset(); 
     buf2.append(buf); 
    } 
} 

}

+0

感謝你reply,kid,disposeCalled和dg2是私有實例變量無法覆蓋的情況。 – Dhorrairaajj

+0

*您調用了restoreState()兩次。檢查它* - 查看參數化的'PdfGraphics2D'構造函數,它們調用'cb.saveState()'兩次。因此,'dispose()'也必須調用'cb.restoreState()'兩次。 – mkl