2012-12-11 70 views
-1

我正在寻找一种方法来实际获取文件本身的内容,以文本格式转储。例如:我不想要一个字典对象,我不想要某种提取策略选项,我只想要与itextsharp用来解析的相同文本文档...整个事物作为字符串或字符串构建器...itextsharp PDF到文本转储

我还没有找到一种方法来做到这一点使用任何工具,所以永远......我的问题是,我正在尝试阅读一个动态的PDF到一个C#应用程序......我们都知道那些补给动态PDF可以不会被iTextSharp解析(AcroForm和AcroFields总是空的),所以我想如果我能得到整个文件的实际文本转储,我可以看到它看起来像什么,并自己解析它为这个特定的任务(例如:为每个我知道我可以收到的文档创建一个类,并根据我所看到的创建一个地图)。

如果任何人都可以帮助我做到这一点,甚至更好,请在C#中找到一种方式来为PDF提取XML源(有点像单击LiveCycle中的XML源代码标签),这将不胜感激。

谢谢!

马特

回答

2

如果你正在寻找的实际经营者和每一页的命令,在原始文本格式,请尝试以下代码:

var reader = new PdfReader("test.pdf"); 
    int intPageNum = reader.NumberOfPages; 
    for (int i = 1; i <= intPageNum; i++) 
    { 
     byte[] contentBytes = reader.GetPageContent(i); 
     File.WriteAllBytes("page-" + i + ".txt", contentBytes); 
    } 
    reader.Close(); 
+0

要知道,即使是全文的页面此页面的内容可能仅仅包含对其他资源流,又包含文本或引用其他资源引用... – mkl

+0

它具有对所选字体,选定图像等的引用。例如,在这里很明显,选择了/ F1字体。现在您知道应该从哪里开始在可用流中查找此对象。 – VahidN

+0

在上下文中,XObject资源可能更相关。或者根本没有,OP似乎毕竟对XFA表单数据感兴趣。 – mkl

0

我正在寻找一种方式来实际以文本格式获取文件 本身的内容,并将其转储。例如:我不想要字典 对象,我不想要某种提取策略选项,我只需要 想要与itextsharp用来解析的相同文本文档...整个 事物作为字符串或stringbuilder .. 。

不幸的是,数据iTextSharp的用于分析尚未文本;该数据中的操作符以某种文本格式给出,但实际的字形可以以完全任意的特殊编码给出。据说,通常使用一些标准编码,因为它是所使用组件的最简单解决方案。不过,你一般不能指望这一点。 VahidN的答案告诉你如何访问该内容的起点;尽管如此,他并不很少提取的页面内容数据只包含对不同对象中包含的资源的引用。

我的问题是,我想读一个动态的PDF成C# 应用程序......我们都知道,那些该死的动态PDF文件无法通过 iTextSharp的(AcroForm和AcroFields解析总是出现空),

这听起来好像你实际上有一个完全不同的任务在手。动态表单及其内容是而不是部分页面内容,而是存储在单独的XML Forms Architecture流中。

iText in Action, 2nd edition,在第8章中给出了关于如何访问XFA流数据的一些信息,第一次查看示例XfaMovie.cs

您可能还想查看iText XML Worker项目,以更轻松地操作XFA流。

+0

mkl:这看起来不错,听起来不错...但它可以与动态PDF一起使用吗?每次我尝试使用任何方法阅读它们时,我都会从Adobe获得一些消息,例如:如果此消息未被PDF内容替代,请更新您的Adobe Reader版本...我可能需要一些时间来实现此类你已经给了我,但我不知道我是否有时间做所有的测试和其他一切......如果你在动态PDF中使用这个类的经验,那将非常感谢! – MaxOvrdrv

+0

@MaxOvrdrv请提供样本PDF;我认为你正在谈论动态的XFA表单; iText in Action中提到的章节展示了如何检索现有的XFA表单数据,并在改变它们之后如何将它们写回。 – mkl

1

如果你只想转储文本,试试这个:

 PdfReader reader = new PdfReader(pdfFileName); 
     String text = ""; 
     nPages = reader.NumberOfPages; 
     for (int i = 0; i < nPages; i++) 
     { 
      text += PdfTextExtractor.GetTextFromPage(reader, i + 1); 
     }