2017-06-01 103 views
0

我需要從iText 5.5.11中的Jasper Reports創建的現有pdf中刪除一些內容,但是在運行PdfCleanUpProcessor之後,所有粗體文本都模糊不清。iText 5.5.11 - 在使用PdfCleanUpProcessor後,粗體文本看起來模糊

這是我使用的代碼:

PdfReader reader = new PdfReader("input.pdf"); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("output.pdf")); 
List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>(); 

cleanUpLocations.add(new PdfCleanUpLocation(1, new Rectangle(0f, 0f, 595f, 680f))); 

PdfCleanUpProcessor cleaner = new PdfCleanUpProcessor(cleanUpLocations, stamper); 
cleaner.cleanUp(); 

stamper.close(); 
reader.close(); 

前面已經討論過here降級到iText的-5.5.4解決了這個問題,但對我來說iText的-5.5.11已經在使用其他原因和降級不是一種選擇。

是否有其他解決方案或解決方法?

這是PDF文件前和清洗後:BEFORE - AFTER

+0

請分享我們可以重現問題的PDF。 – mkl

+0

@mkl使用「BEFORE」PDF重現問題 – Tieco

+0

嗯,好的,對不起,我沒有正確閱讀您的問題文本,並預期只有圖像。我會看看。 – mkl

回答

0

通過比較之前文件很清楚,由於某些原因,PdfCleanUpProcessor錯誤降到一般的圖形狀態的操作(至少w,Jd)。


在你之前文件,特別是因爲一個窮人的大膽變體使用,即而不是使用實際的粗體使用正常字體和W¯¯操作的文本很重要文本渲染模式不僅可以填充字形輪廓,還可以沿着它畫一條線,使其具有大膽的外觀。

使用w操作將該行的寬度設置爲0.23333。由於文檔中的中缺少該操作,因此使用默認寬度值1。因此,沿着輪廓的線現在是以前的4倍,導致非常肥胖的外觀。


這個問題已經引入了提交d5abd23(日期爲2015年5月4日)的(除其他事項外)加入該塊PdfCleanUpContentOperator.invoke

} else if (lineStyleOperators.contains(operatorStr)) { 
    if ("w" == operatorStr) { 
     cleanUpStrategy.getContext().setLineWidth(((PdfNumber) operands.get(0)).floatValue()); 
    } else if ("J" == operatorStr) { 
     cleanUpStrategy.getContext().setLineCapStyle(((PdfNumber) operands.get(0)).intValue()); 
    } else if ("j" == operatorStr) { 
     cleanUpStrategy.getContext().setLineJoinStyle(((PdfNumber) operands.get(0)).intValue()); 
    } else if ("M" == operatorStr) { 
     cleanUpStrategy.getContext().setMiterLimit(((PdfNumber) operands.get(0)).floatValue()); 
    } else if ("d" == operatorStr) { 
     cleanUpStrategy.getContext().setLineDashPattern(new LineDashPattern(((PdfArray) operands.get(0)), 
       ((PdfNumber) operands.get(1)).floatValue())); 
    } 

    disableOutput = true; 

這會導致所有lineStyleOperators將同時下降同時試圖將更改後的值存儲在清理策略上下文中。但是當然使用==代替String在Java中的比較通常是一個非常糟糕的主意,所以自該版本以來,線型運算符在iText中的性能下降了。

其實這段代碼已經從iTextSharp移植過來了,在C#==中爲string類型的作品完全不同;儘管如此,即使在iTextSharp版本中,這些存儲的值乍一看似乎只在路徑被撫摸時才被考慮到,而不是如果文本渲染包括沿輪廓撫摸。

後來在提交9967627(在同一天與上述提交)內if..else if..else..已經與來自itext.pdf.parser包現有GraphicsState代替PdfCleanUpGraphicsState註釋刪除,添加缺少的參數到後者,只有disableOutput = true保持。這(乍一看)似乎已經解決了iText/Java和iTextSharp/.Net之間的差異,但是如果文本呈現包括沿着輪廓線描邊,線樣式值仍然不被考慮。


作爲一種變通考慮刪除線

} else if (lineStyleOperators.contains(operatorStr)) { 
    disableOutput = true; 

PdfCleanUpContentOperator.invoke。現在線樣式運算符不再被刪除,編輯後的PDF中的文本看起來像之前一樣。儘管如此,我還沒有檢查過任何副作用,所以在考慮在生產中使用該解決方案之前,請先用一些文檔進行測試。

+0

謝謝併爲延遲感到抱歉。我會嘗試建議的解決方法並讓您知道 – Tieco

+0

您的解釋有助於我理解此問題的原因。不幸的是,提出的解決方法意味着修改了itext庫,我無法確保定製版本將來不會被更新。可能最好的選擇是改變粗體的生成方式。 – Tieco

+0

或者,您可以將清理軟件包中的所有內容複製到您自己的軟件包中,然後在其中應用修復程序。不是最優雅的解決方案,但那是什麼! – mkl

相關問題