2011-09-03 30 views
5

Próbuję znaleźć zestaw SDK, który może generować plik PDF z OpenXml. Korzystałem z Open Xml Power Tools, aby przekonwertować otwarty XML i html oraz używając iTextSharp do parsowania HTML do PDF. Ale wynikiem jest bardzo okropnie wyglądający plik PDF.Generowanie pliku PDF z OpenXml

Nie próbowałem jeszcze parsera RTF iText. Jeśli pójdę w tym kierunku, będę potrzebował konwertera RTF, co spowoduje, że zwykła konwersja stanie się koszmarem podwójnego kroku.

Wygląda na to, że mogę napisać niestandardowy konwerter oparty na narzędziu narzędziowym OpenXml do konwertera html. Wszelkie porady są mile widziane. Naprawdę w tym momencie nie mogę skończyć na profesjonalnym konwerterze, ponieważ licencje są zbyt drogie (Aspose Word/TxText).


Myślałem, że włożę trochę więcej wysiłku w moje dochodzenie. Wróciłem do narzędzia konwersji "http://msdn.microsoft.com/en-us/library/ff628051.aspx" i przejrzałem jego kod. Największe, co przegapił, to odczytywanie podstawowych stylów i generowanie atrybutów stylu. Plik PDF wyglądał znacznie lepiej dzięki ograniczeniu nieobsługiwania niestandardowej czcionki True Type. Więcej dochodzenia jutro. Mam nadzieję, że zrobił coś takiego/stanął w obliczu dziwnych problemów i może rzucić trochę światła.

 



    private static StringDictionary GetStyle(XElement el) 
    { 
     IEnumerable jcL = el.Elements(W.jc); 
     IEnumerable spacingL = el.Elements(W.spacing); 
     IEnumerable rPL = el.Elements(W.rPr); 

     StringDictionary sd = new StringDictionary(); 

     if (HasAttribute(jcL, W.val)) sd.Add("text-align", GetAttribute(jcL, W.val)); 

     // run prop exists 
     if (rPL.Count() > 0) 
     { 
      XElement r = rPL.First(); 
      IEnumerable ftL = el.Elements(W.rFonts); 

      if (r.Element(W.b) != null) sd.Add("font-weight", "bolder"); 
      if (r.Element(W.i) != null) sd.Add("font-style", "italic"); 
      if (r.Element(W.u) != null) sd.Add("text-decoration", "underline"); 
      if (r.Element(W.color) != null && HasAttribute(r.Element(W.color), W.val)) sd.Add("color", "#" + GetAttribute(r.Element(W.color), W.val)); 
      if (r.Element(W.rFonts) != null) 
      { 
       // 
       if(HasAttribute(r.Element(W.rFonts), W.cs)) sd.Add("font-family", GetAttribute(r.Element(W.rFonts), W.cs)); 
       else if (HasAttribute(r.Element(W.rFonts), W.hAnsi)) sd.Add("font-family", GetAttribute(r.Element(W.rFonts), W.hAnsi)); 
      } 
      if (r.Element(W.sz) != null && HasAttribute(r.Element(W.sz), W.val)) sd.Add("font-size", GetAttribute(r.Element(W.sz), W.val) + "pt"); 
     } 

     return sd.Keys.Count > 0 ? sd : null; 
    } 

 
+0

Przykład: http://msdn.microsoft.com/en-us/library/ff628051.aspx – Shrini

Odpowiedz

1

ja nie znam żadnego bezpośredniego konwerter z kodu źródłowego dostępnej, ale tak, moja myśl jest taka, że ​​być może trzeba będzie zbudować konwerter od podstaw. Na szczęście (chyba), WordprocessingML programu Word jest najprostszą z otwartych formatów XML i można spojrzeć na inne projekty dla inspiracji, takich jak:

  1. TextGlow - Word Converter Silverlight
  2. Word to XAML Converter - Word konwerter XAML (prawdopodobnie bardzo podobny do TextGlow powyżej)
  3. OpenXML-DAISY - konwersja Daisy
  4. ODF Converter - konwersja/z formatów OpenOffice OpenXML
  5. roztwór XHTML przez Eric White już wspomniałeś.

dla komercyjnych & rozwiązań po stronie serwera, można użyć albo Word Automations Services (wymaga programu SharePoint) lub Apose.NET Words.

+0

Utrzymałem słowo "automatyzacja" jako ostateczny wynik w formacie PDF. itextsharp wykonuje bardzo kiepskie zadanie konwersji, szczególnie z HTML. Dzięki. – Shrini