Самый простой способ переноса данных таблицы html в читаемый документ - PullRequest
0 голосов
/ 12 сентября 2011

Хорошо,

В течение последних 6 месяцев я изо всех сил пытался создать систему, которая позволяет вводить данные пользователем в виде больших сексуальных текстовых областей (с множеством поддержки таблиц, списков и т. Д.).В значительной степени позволяет пользователю вводить данные, как если бы это было слово.Однако, когда я хотел экспортировать все эти данные, я не смог найти работающее решение ...

Первым делом я попытался найти программное обеспечение для составления отчетов, которое бы поддерживало необработанный HTML из источника данных и рендеринга.это как обычный html, работал отлично, за исключением того, что функция «держать вместе» ужасна, либо данные разбиты на две части (таблицы, списки и т. д.), что мне не нужно.Или отчет всегда пропускает к следующей странице, чтобы избежать этого, заканчивая 15+ пустыми страницами в конечном документе.

Так что я ищу какой-то совет / направление к тому, что было бы лучшим решением для экспорта моегоданные в удобочитаемый документ (pdf или word pref).

Я получил следующую разбивку данных, где данные часто представляют собой необработанные html.

-Period

-Единица измерения

--- Группа

---- Вопрос

----- Данные

Каков будет лучший выбор?Пытаясь сделать HTML в PDF или RTF?Мне нужны советы: (

А также иногда данные длиной 2-3 страницы со списками смешанных таблиц и простым текстом.

Ответы [ 4 ]

2 голосов
/ 12 сентября 2011

Решение, которое вы можете использовать, - запустить приложение на сервере с помощью System.Diagnostics.Process, который преобразует сайт и сохраняет его в виде PDF-документа.

Вы можете использовать wkhtmltopdf , консольную программу с открытым исходным кодом, которая может конвертировать из HTML в PDF или изображение.

Установщик для Windows можно получить из wkhtmltox-0.10.0_rc2 Установщик Windows (i368) .

После установки wkhtmltopdf вы можете скопировать файлы в папку установки внутри вашего решения. Вы можете использовать такую ​​настройку в решении:

Преобразованные файлы PDF будут сохранены в папке PDF.

А вот код для преобразования:

var wkhtmltopdfLocation = Server.MapPath("~/wkhtmltopdf/") + "wkhtmltopdf.exe";
var htmlUrl = @"http://stackoverflow.com/q/7384558/750216";
var pdfSaveLocation = "\"" + Server.MapPath("~/wkhtmltopdf/pdf/") + "question.pdf\"";

var process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = wkhtmltopdfLocation;
process.StartInfo.Arguments = htmlUrl + " " + pdfSaveLocation;
process.Start();
process.WaitForExit();

htmlUrl - это местоположение страницы, которую нужно конвертировать в pdf. Это установлено на этой странице stackoverflow. :)

2 голосов
/ 12 сентября 2011

Я бы посоветовал вам сохранить это в браузере и добавить таблицу стилей печати в HTML, чтобы он отображался одним способом на экране, а другим способом - на бумаге, Добавить таблицу стилей для печати в ваш HTML так же просто, как это:

<link rel="stylesheet" media="print" href="print.css">

Вы должны быть в состоянии проанализировать входные данные с помощью чего-то вроде Html Agility Pack и преобразовать его (т. Е. С XSLT ) в любой выходной формат, который вы хотите.

Другой вариант - записать HTML в браузер, но с Content-Type, установленным для конкретного варианта Microsoft Word (есть несколько вариантов на выбор, в зависимости от версии Word, на которую вы ориентируетесь), браузер должен спросить если пользователь хочет открыть страницу с помощью Microsoft Word. В Word 2007 и новее вы также можете написать Office Open XML Word напрямую, поскольку он основан на XML.

Типы контента, которые вы можете использовать:

application/msword

Для двоичных файлов Microsoft Word, но также должно работать для HTML.

application/vnd.openxmlformats-officedocument.wordprocessingml.document

Для более новых форматов "Office Open XML" Word 2007 и новее.

1 голос
/ 12 сентября 2011

Вот еще один вариант, использовать экраны печати (хотя он не заботится о прокрутке, я думаю, вы должны быть в состоянии встроить это). Этот пример может быть расширен для удовлетворения потребностей вашего бизнеса, хотя это своего рода взлом. Вы передаете ему URL-адрес, который генерирует изображение.

Звоните вот так

 protected void Page_Load(object sender, EventArgs e)
            {
                int screenWidth = Convert.ToInt32(Request["ScreenWidth"]);
                int screenHeight = Convert.ToInt32(Request["ScreenHeight"]);
                string url =        Request["Url"].ToString();
                string bitmapName = Request["BitmapName"].ToString();


            WebURLToImage webUrlToImage = new WebURLToImage()
            {
                Url = url,
                BrowserHeight = screenHeight,
                BrowserWidth = screenWidth,
                ImageHeight = 0,
                ImageWidth = 0
            };

        webUrlToImage.GenerateBitmapForUrl();
        webUrlToImage.GeneratedImage.Save(Server.MapPath("~") + @"Images\" +bitmapName + ".bmp");
    }

Создание изображения с веб-страницы.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.IO;

public class WebURLToImage
{
    public string Url { get; set; }
    public Bitmap GeneratedImage { get; private set; }
    public int ImageWidth { get; set; }
    public int ImageHeight { get; set; }
    public int BrowserWidth { get; set; }
    public int BrowserHeight { get; set; }

    public Bitmap GenerateBitmapForUrl()
    {
        ThreadStart threadStart = new ThreadStart(ImageGenerator);
        Thread thread = new Thread(threadStart);

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
        return GeneratedImage;
    }

    private void ImageGenerator()
    {
        WebBrowser webBrowser = new WebBrowser();
        webBrowser.ScrollBarsEnabled = false;
        webBrowser.Navigate(Url);

        webBrowser.DocumentCompleted += new
WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);

        while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();
        webBrowser.Dispose();
    }

    void webBrowser_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser webBrowser = (WebBrowser)sender;
        webBrowser.ClientSize = new Size(BrowserWidth, this.BrowserHeight);
        webBrowser.ScrollBarsEnabled = false;
        GeneratedImage = new Bitmap(webBrowser.Bounds.Width, webBrowser.Bounds.Height);
        webBrowser.BringToFront();

        webBrowser.DrawToBitmap(GeneratedImage, webBrowser.Bounds);

        if (ImageHeight != 0 && ImageWidth != 0)
            GeneratedImage =
(Bitmap)GeneratedImage.GetThumbnailImage(ImageWidth, ImageHeight,
null, IntPtr.Zero);
    }
}
1 голос
/ 12 сентября 2011

Это общий вопрос, но в голову приходят две вещи: Шаблон посетителя и Изменение типа пантомимы.

Шаблон посетителя У вас может быть два отдельных метода рендеринга. Это будет зависеть от вашей реализации.

MIME Тип Когда запрос сделан, запишите дату в Ответе и т. Д.

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Charset = "utf-16";
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.doc", filename));
HttpContext.Current.Response.ContentType = "application/msword";
HttpContext.Current.Response.Write("-Period");
HttpContext.Current.Response.Write("/n");
HttpContext.Current.Response.Write("--Unit");
HttpContext.Current.Response.Write("/n");
HttpContext.Current.Response.Write("---Group");
HttpContext.Current.Response.Write("/n");
HttpContext.Current.Response.Write("----Question");
HttpContext.Current.Response.Write("/n");
HttpContext.Current.Response.Write("-----Data");
HttpContext.Current.Response.Write("/n");
HttpContext.Current.Response.End();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...