我有一些用户提供的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