在pdf文档中获取文档向量计数?

时间:2011-02-15 17:57:00

标签: c# pdf itextsharp

我的一些用户提供的pdf文档存在问题。它们是从3d包创建的,基本上是一个巨大的矢量线列表,它们需要渲染和渲染(超过60秒)。

如何使用iTextSharp (5.0.5)生成pdf文档中存在的矢量线数量的报告?

我可以获取文本和图像数据,但无法查看向量处理的位置。它们似乎没有被表示为图像。

2 个答案:

答案 0 :(得分:1)

iText [Sharp]的解析器包还没有处理lineTo或curveTo命令。这是一个目标,但还不是一个足以实现的目标。其他事情正在受到关注。

如果你喜欢冒险,你应该看看PdfContentStreamProcessor。在私有函数populateOperators中,有一长串命令当前处理(以某种方式或另一种方式)。

您需要为所有艺术线条命令(moveTo,lineTo,rect,stroke,fill,clip)编写类似的命令类,并以某种方式公开它们。

实际上,如果你想做的只是COUNT路径数,你可以实现stroke和fill来增加一些静态整数[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.

这样的事情。如果您遇到任何文本或图像,只有null RenderListener将导致空指针异常。你可以自己创建一个无操作的监听器,或者使用现有的一个监听器并忽略它的输出。

PS:iTextSharp 5.0.6现在应该在任何一天发布,如果它还没有发布。

答案 1 :(得分:0)

没有特定的矢量图像。通常它只是添加到内容流中,它本质上是一个用于绘制整个页面的Vector数据流。

有一篇博客文章,您可能会发现在http://www.jpedal.org/PDFblog/2010/11/grow-your-own-pdf-file-%E2%80%93-part-5-path-objects/

中了解这一点很有用