2009-06-17 4 views
0

Мне нужно преобразовать PDF в кодировку Base64 и записать ее в элемент XML-файла.
я получил кодировку Base64 строку (очень длинные/большой), но спецификации им работать с говорит следующее:Linq to XML (Base64 Encoded)

Это было выбрано, чтобы обеспечить может отображаться и проверенный без каких-либо потенциальных проблем, вызванных файл XML путем обработки исходной двоичной композиции исходного файла JPEG. Данные файла должны корректно отображать в совместимом с XML браузере, таком как Internet Explorer. Данные должны быть представлены в фиксированных 76 символьных строках, каждая строка разделяется разрывом строки.
Первый вопрос о бит о JPEG, что действительно, если я использую pdf?

Во-вторых, не знаю, как это сделать: данные должны быть представлены в фиксированных 76 символьных строках, каждая строка разделяется разрывом строки.
Как я могу достичь этого с Linq в XML

ответ

3
Convert.ToBase64String(pdfBytes, Base64FormattingOptions.InsertLineBreaks); 
1

Это не очень эффективное решение из-за вставок (возможно, было бы лучше построить строку, добавив 76 символов из содержимого кодированного файла, затем новую строку, затем 76 символов, затем снова новая строка, ...), но она короткая и демонстрирует общую идею. Если проблема с памятью и производительностью является проблемой, можно также подумать о замене вызова Convert.ToBase64String() кодом, который напрямую кодирует байты в StringBuilder.

public static XElement BuildNode(Byte[] data, XName tagName, Int32 lineLength) 
{ 
    StringBuilder sb = new StringBuilder(Convert.ToBase64String(data)); 

    Int32 position = 0; 

    while (position < sb.Length) 
    { 
     sb.Insert(position, Environment.NewLine); 
     position += lineLength + Environment.NewLine.Length; 
    } 

    sb.AppendLine(); 

    return new XElement(tagName, sb.ToString()); 
} 

Например

String text = "I have got to convert a PDF to a Base64 Encoded " + 
       "and write it to a element in a XML file."; 

Byte[] data = Encoding.UTF8.GetBytes(text); 

StringBuilder sb = new StringBuilder(); 
TextWriter tw = new StringWriter(sb); 

using (var writer = new XmlTextWriter(tw) { Formatting = Formatting.Indented }) 
{ 
    XDocument document = new XDocument(BuildNode(data, "Content", 40)); 

    document.Save(writer); 
} 

Console.WriteLine(sb.ToString()); 

печатает следующее.

<?xml version="1.0" encoding="utf-16"?> 
<Content> 
SSBoYXZlIGdvdCB0byBjb252ZXJ0IGEgUERGIHRv 
IGEgQmFzZTY0IEVuY29kZWQgYW5kIHdyaXRlIGl0 
IHRvIGEgZWxlbWVudCBpbiBhIFhNTCBmaWxlLg== 
</Content>