我有一些用戶提供的pdf文檔存在問題。它們是從3d軟件包創建的,基本上是一個巨大的矢量線列表,需要時間和渲染時間(超過60秒)。獲取PDF文檔中的文檔向量計數?
如何使用iTextSharp (5.0.5)生成PDF文檔中存在的向量行數的報告?
我可以獲取文本和圖像數據,但無法看到哪裏得到處理向量。他們似乎並不像一個形象。
我有一些用戶提供的pdf文檔存在問題。它們是從3d軟件包創建的,基本上是一個巨大的矢量線列表,需要時間和渲染時間(超過60秒)。獲取PDF文檔中的文檔向量計數?
如何使用iTextSharp (5.0.5)生成PDF文檔中存在的向量行數的報告?
我可以獲取文本和圖像數據,但無法看到哪裏得到處理向量。他們似乎並不像一個形象。
iText的[夏普]的解析器包中尚未辦理了lineTo或curveTo命令中有用的博客文章。這是一個目標,但目前還沒有足夠重要的目標。其他的事情正在得到關注。
如果你覺得冒險,你應該檢查出PdfContentStreamProcessor。在一個私有函數populateOperators
中,有一長串當前處理的命令(以某種方式或另一種方式)。
您需要爲所有線條藝術命令(moveTo,lineTo,rect,stroke,fill,clip)編寫類似的命令類,並以某種方式公開它們。實際上,如果你想要做的只是COUNT路徑的數量,你可以實現筆畫並填充以增加一些靜態整數[s],然後在解析後檢查它們。應該相當簡單(我用Java編寫,但翻譯起來很簡單):
private static class CountOps implements ContentOperator {
public static int operationCount = 0;
public void invoke(PdfContentStreamProcessor processor, PdfLiteral operator, ArrayList<PdfObject> operands) {
++operationCount;
}
}
啊! registerContentOperator
是一個公共職能。您根本不需要更改iText的源代碼:
PdfContentStreamProcessor proc = new PdfContentStreamProcessor(null);
CountOps counter = new CountOps();
proc.registerContentOperator("S", countOps); // stroke the path
proc.registerContentOperator("s", countOps); // close & stroke
proc.registerContentOperator("F", countOps); // fill, backward compat
proc.registerContentOperator("f", countOps); // fill
proc.registerContentOperator("f*", countOps); // fill with event-odd winding rule
proc.registerContentOperator("B", countOps); // fill & stroke
proc.registerContentOperator("B*", countOps); // fill & stroke with even-odd
proc.registerContentOperator("b", countOps); // close, fill, & stroke
proc.registerContentOperator("b*", countOps); // close, fill, & stroke with even-odd
proc.processContent(contentBytes, pageResourceDict);
int totalStrokesAndFills = CountOps.operationCount; // note that stroke&fill operators will be counted once, not twice.
類似的東西。如果遇到任何文本或圖像,只有空RenderListener會導致空指針異常。您可以自己鞭策一個無操作監聽器,或者使用現有的監聽器並忽略其輸出。
PS:iTextSharp 5.0.6現在應該在任何一天發佈,如果它還沒有出來的話。
沒有具體的矢量圖像。通常它只是添加到內容流中,這本質上是一個Vector數據流,用於繪製整個頁面。
有,你可能會發現有助於瞭解該在http://www.jpedal.org/PDFblog/2010/11/grow-your-own-pdf-file-%E2%80%93-part-5-path-objects/
嗨,我想出了一條快速的方法沿着同樣的路線。在while(tokenizer.NextToken())循環中,我可以查找tontntype「OTHER」,並將標記器字符串值與列表或矢量操作值進行比較(包括上面但也包含「l」,「c」,「v」 「y」,「h」,「re」。它似乎工作得很好,因爲我的目標主要是識別需要一段時間才能渲染的文檔。iText in Action,第二版非常有幫助 – 2011-02-15 23:39:03