2013-08-12 3 views
0

У меня есть метод ниже, который должен был возвращать количество слоев в PDF, но он не работает. Когда я передаю путь к PDF-файлу, содержащему два слоя, свойство count слоя имеет значение 1. Я подтвердил двумя разными читателями PDF, что в PDF есть два слоя. Моя единственная мысль - ABCPDF выравнивает слои PDF во время чтения. Если да, то как я могу предотвратить это, поэтому возвращается точное количество количества слоев в PDF?Почему ABCPDF правильно подсчитывает слои PDF?

Спасибо

public static int GetPDFLayerCount(string pdfFile) 
    { 

     int layerCount = 0; 

     Doc doc = new Doc(); 
     doc.SetInfo(0, "License", _License); 

     // Attempt to read File 
     try 
     { 
      if (System.IO.File.Exists(pdfFile) == false) 
      { 
       throw new ApplicationException("File does not exist."); 
      } 

      doc.Read(pdfFile); 
      layerCount = doc.LayerCount; 

      doc.Clear(); 
      doc.Dispose(); 

     } 
     catch (Exception ex) 
     { 
      System.ApplicationException appException = new ApplicationException(ex.Message + "\r\n\r\n" + pdfFile,ex); 
      throw appException; 
     } 

     return layerCount; 


    } 
+0

Как я думал, я протестировал свой метод с использованием PDF I, использующего ABCPDF, и метод LayerCount работал должным образом. Итак, я больше не думаю, что ABCPDF сглаживает PDF во время чтения. Итак, теперь я не понимаю, почему LayerCount не работает для файла, у которого не было слоев, добавленных через ABCPDF. Любая помощь приветствуется. – rsine

+0

В качестве обновления я обнаружил, что iTextSharp имеет метод GetPDFLayers, который правильно обеспечивает подсчет слоев в PDF (оба, созданные с помощью ABCPDF, и те, которые не были). Благодарю. – rsine

+0

Какую версию ABCPDF вы используете? –

ответ

0

Ниже тот же метод с использованием iTextSharp. Я тестировал многослойные PDF-файлы, созданные в ABCPDF, и те, которые не были и в обоих случаях работали.

public static int GetPDFLayerCount(string pdfFile, bool includeHiddenLayersInCount = true) 
    { 
     int layerCount = 0; 

     string tempOutputFile = ""; 

     try 
     { 

      tempOutputFile = System.IO.Path.GetTempFileName(); 

      iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(pdfFile); 

      iTextSharp.text.pdf.PdfStamper pdfStamper = new iTextSharp.text.pdf.PdfStamper(pdfReader, new System.IO.FileStream(tempOutputFile, System.IO.FileMode.Create)); 

      System.Collections.Generic.Dictionary<string, iTextSharp.text.pdf.PdfLayer> layers = pdfStamper.GetPdfLayers(); 

      layerCount = layers.Count; 


      if (!includeHiddenLayersInCount) 
      { 
       foreach (System.Collections.Generic.KeyValuePair<string, iTextSharp.text.pdf.PdfLayer> dictLayer in layers) 
       { 
        iTextSharp.text.pdf.PdfLayer layer = (iTextSharp.text.pdf.PdfLayer)dictLayer.Value; 

        //On = whether a layer is hidden or visible. If false, layer is hidden. 
        // 
        //OnPanel = the visibility of the layer in Acrobat's layer panel. If false, the layer cannot be directly manipulated by the user and appears hidden. 
        //Note that any children layers will also be absent from the panel. 
        if (layer.Value.On == false || layer.Value.OnPanel == false) 
        { 
         layerCount--; 
        } 
       } 
      } 

      pdfStamper.Close(); 
      pdfReader.Close(); 

     } 
     catch (Exception ex) 
     { 
      System.ApplicationException appException = new ApplicationException(ex.Message + "\r\n\r\n" + pdfFile, ex); 
      throw appException; 
     } 
     finally 
     { 

      try 
      { 
       if (!String.IsNullOrEmpty(tempOutputFile)) 
       { 
        System.IO.File.Delete(tempOutputFile); 
       } 
      } 
      catch (Exception ex) 
      { 
      } 

     } 
       } 
Смежные вопросы