преобразование PDF в XML с использованием .NET - PullRequest
6 голосов
/ 09 июня 2011

В настоящее время я создаю приложение .NET, и одно из требований заключается в том, что оно должно преобразовывать файл PDF в файл XML.У кого-нибудь был успех в этом?Если да, что ты использовал?

Ответы [ 4 ]

5 голосов
/ 09 июня 2011

Я делал этот проект много раз раньше.

Что нужно сделать:

1.) Проверить этот проект Извлечь текст из PDF в C #.В проекте используется ITextSharp.

  • Было бы лучше, если вы скачаете пример проекта и посмотрите, как он работает.В этом проекте показано, как извлечь данные из PDF-файла.Проверьте класс PDFParser, он имеет функцию с именем ExtractTextFromPDFBytes (byte [] input) , из этой функции вы можете видеть, как текст извлекается из несжатого файла PDF. Не забудьте включить библиотеку ITextSharp.

Класс PDFParser

  1  using System;
  2  using System.IO;
  3  using iTextSharp.text.pdf;
  4  
  5  namespace PdfToText
  6  {
  7      /// 
  8      /// Parses a PDF file and extracts the text from it.
  9      /// 
 10      public class PDFParser 
 11      {
 12          /// BT = Beginning of a text object operator 
 13          /// ET = End of a text object operator
 14          /// Td move to the start of next line
 15          ///  5 Ts = superscript
 16          /// -5 Ts = subscript
 17  
 18          #region Fields
 19  
 20          #region _numberOfCharsToKeep
 21          /// 
 22          /// The number of characters to keep, when extracting text.
 23          /// 
 24          private static int _numberOfCharsToKeep = 15;
 25          #endregion
 26  
 27          #endregion
 28  
 29          #region ExtractText
 30          /// 
 31          /// Extracts a text from a PDF file.
 32          /// 
 33          /// the full path to the pdf file.
 34          /// the output file name.
 35          /// the extracted text
 36          public bool ExtractText(string inFileName, string outFileName)
 37          {
 38              StreamWriter outFile = null;
 39              try
 40              {
 41                  // Create a reader for the given PDF file
 42                  PdfReader reader = new PdfReader(inFileName);
 43                  //outFile = File.CreateText(outFileName);
 44                  outFile = new StreamWriter(outFileName, false, System.Text.Encoding.UTF8);
 45                  
 46                  Console.Write("Processing: ");
 47                  
 48                  int     totalLen    = 68;
 49                  float   charUnit    = ((float)totalLen) / (float)reader.NumberOfPages;
 50                  int     totalWritten= 0;
 51                  float   curUnit     = 0;
 52  
 53                  for (int page = 1; page = 1.0f)
 59                      {
 60                          for (int i = 0; i = 1.0f)
 70                          {
 71                              for (int i = 0; i 
104          /// This method processes an uncompressed Adobe (text) object 
105          /// and extracts text.
106          /// 
107          /// uncompressed
108          /// 
109          private string ExtractTextFromPDFBytes(byte[] input)
110          {
111              if (input == null || input.Length == 0) return "";
112  
113              try
114              {
115                  string resultString = "";
116  
117                  // Flag showing if we are we currently inside a text object
118                  bool inTextObject = false;
119  
120                  // Flag showing if the next character is literal 
121                  // e.g. '\\' to get a '\' character or '\(' to get '('
122                  bool nextLiteral = false;
123  
124                  // () Bracket nesting level. Text appears inside ()
125                  int bracketDepth = 0;
126  
127                  // Keep previous chars to get extract numbers etc.:
128                  char[] previousCharacters = new char[_numberOfCharsToKeep];
129                  for (int j = 0; j = ' ') && (c = 128) && (c 
235          /// Check if a certain 2 character token just came along (e.g. BT)
236          /// 
237          /// the searched token
238          /// the recent character array
239          /// 
240          private bool CheckToken(string[] tokens, char[] recent)
241          {
242              foreach(string token in tokens)
243              {
244                  if ((recent[_numberOfCharsToKeep - 3] == token[0]) &&
245                      (recent[_numberOfCharsToKeep - 2] == token[1]) &&
246                      ((recent[_numberOfCharsToKeep - 1] == ' ') ||
247                      (recent[_numberOfCharsToKeep - 1] == 0x0d) ||
248                      (recent[_numberOfCharsToKeep - 1] == 0x0a)) &&
249                      ((recent[_numberOfCharsToKeep - 4] == ' ') ||
250                      (recent[_numberOfCharsToKeep - 4] == 0x0d) ||
251                      (recent[_numberOfCharsToKeep - 4] == 0x0a))
252                      )
253                  {
254                      return true;
255                  }
256              }
257              return false;
258          }
259          #endregion
260      }
261  }

2.) Выполните синтаксический анализ извлеченного текста исоздать и XML-файл.

  • Некоторые из моих проблем раньше - это PDF-файлы, которые содержат неработающие ссылки или URL-адреса внутри страниц.Теперь, на всякий случай, если вы также обеспокоены этой проблемой, регулярное выражение 1027 * может легко решить вашу проблему, но я предлагаю вам разобраться с ней позже.

  • Теперь вот пример кода о том, как создать XML.Поймите, как работает код, так что позже вы узнаете, как работать с вашим собственным кодом.

    try {
        //XmlDataDocument sourceXML = new XmlDataDocument();
        string xmlFile = Server.MapPath(“DVDlist.xml”);
        //create a XML file is not exist
        System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(xmlFile, null);
        //starts a new document
        writer.WriteStartDocument();
        //write comments
        writer.WriteComment(“Commentss: XmlWriter Test Program”);
        writer.Formatting = Formatting.Indented;
        writer.WriteStartElement(“DVDlist”);
        writer.WriteStartElement(“DVD”);
        writer.WriteAttributeString(“ID”, “1″);
        //write some simple elements
        writer.WriteElementString(“Title”, “Tere Naam”);
        writer.WriteStartElement(“Starring”);
        writer.WriteElementString(“Actor”, “Salman Khan”);
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.Close();
    } 
    catch (Exception e1) { 
        Page.Response.Write(e1); 
    }

Надеюсь, это поможет:)

2 голосов
/ 09 июня 2011

Вы можете использовать библиотеку PDF, такую ​​как iTextSharp , чтобы запросить ваш файл PDF.После того, как вы получили доступ к нужным вам данным, вы можете легко создать XML-файл.В Интернете есть тонна информации о том, как создать XML-файл с помощью C # и других языков .net.Если у вас есть конкретный вопрос, просто спросите ;-)

0 голосов
/ 06 апреля 2017

Посмотрите на pdf2Data.
http://itextpdf.com/blog/pdf2data-extract-information-invoices-and-templates

Преобразует PDF-файлы в XML-файлы на основе шаблона. Шаблоны определяются с помощью селекторов, которые позволяют конечному пользователю указывать такие вещи, как «выбрать таблицу на 2-й странице» или «выбрать текст, написанный этим конкретным шрифтом» и т. Д.

Имейте в виду, что я связан с iText, поэтому, хотя мои знания PDF обширны, меня могут посчитать предвзятым отношением к продуктам iText (поскольку я помогаю им в их разработке).

0 голосов
/ 19 июня 2011

В итоге я использовал SDK экстрактора байтов Scout .Это работает очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...