Вызов wkhtmltopdf для генерации PDF от HTML

попробуйте backgroundPosition istead

кроме того, удостоверьтесь, что 'это' существует и что Ваш запрос на атрибут возвращает значение. IE бросит этот вид ошибок, когда Вы попытаетесь назвать метод на свойстве, которое не существует, поэтому bg является пустым, или аннулируйте объект. если Вы не заботитесь о IE, можно сделать bg = $ (это)... || '' так, чтобы всегда было что-то ссылаемое.

кроме того, не связанный с ошибкой Вы добираетесь, но Ваше индексное значение 1 корректного? Вы имели в виду-1?

53
задан Ryan Gates 1 April 2015 в 05:42
поделиться

5 ответов

У процесса ASP .Net, вероятно, нет доступа на запись в каталог.

Попробуйте указать ему, чтобы он записал в % TEMP% , и посмотрите, работает ли он .

Кроме того, сделайте так, чтобы ваша страница ASP .Net отображала stdout и stderr процесса, и проверьте сообщения об ошибках.

0
ответ дан 7 November 2019 в 08:28
поделиться

Есть много причин, по которым это вообще плохая идея. Как вы собираетесь контролировать исполняемые файлы, которые создаются, но в конечном итоге остаются в памяти в случае сбоя? А как насчет атак типа «отказ в обслуживании» или если что-то вредоносное попадает в TestPDF.htm?

Насколько я понимаю, учетная запись пользователя ASP.NET не будет иметь прав для локального входа в систему. Он также должен иметь правильные разрешения для доступа к исполняемому файлу и записи в файловую систему. Вам необходимо отредактировать локальную политику безопасности и разрешить учетной записи пользователя ASP.NET (возможно, ASPNET) входить локально (по умолчанию она может быть в списке запрещенных). Затем вам нужно отредактировать разрешения файловой системы NTFS для других файлов. Если вы находитесь в среде виртуального хостинга, может быть невозможно применить нужную конфигурацию.

Лучший способ использовать внешний исполняемый файл, подобный этому, - ставить задания в очередь из кода ASP.NET и иметь какую-то службу, отслеживающую очередь. Если вы сделаете это, то защитите себя от всякого рода плохих вещей. На мой взгляд, проблемы обслуживания с изменением учетной записи пользователя не стоят усилий, и хотя настройка службы или запланированного задания - это боль, это просто лучший дизайн. Страница ASP.NET должна опрашивать очередь результатов для вывода, и вы можете предоставить пользователю страницу ожидания. Это приемлемо в большинстве случаев.

и хотя настройка службы или запланированного задания - это боль, это просто лучший дизайн. Страница ASP.NET должна опрашивать очередь результатов для вывода, и вы можете предоставить пользователю страницу ожидания. Это приемлемо в большинстве случаев.

и хотя настройка службы или запланированного задания - это боль, это просто лучший дизайн. Страница ASP.NET должна опрашивать очередь результатов для вывода, и вы можете предоставить пользователю страницу ожидания. Это приемлемо в большинстве случаев.

5
ответ дан 7 November 2019 в 08:28
поделиться

Обновление:
Мой ответ ниже создает файл pdf на диске. Затем я отправил этот файл в пользовательский браузер для загрузки. Подумайте о том, чтобы использовать что-то вроде ответа Hath, приведенного ниже, чтобы вместо этого получить wkhtml2pdf для вывода в поток, а затем отправить его непосредственно пользователю - это позволит обойти множество проблем с правами доступа к файлам и т. Д.

Мой исходный ответ:
Убедитесь, что вы ' Мы указали выходной путь для PDF-файла, который может быть записан процессом ASP.NET IIS, запущенным на вашем сервере (обычно NETWORK_SERVICE, я думаю).

Мой выглядит так (и он работает):

/// <summary>
/// Convert Html page at a given URL to a PDF file using open-source tool wkhtml2pdf
/// </summary>
/// <param name="Url"></param>
/// <param name="outputFilename"></param>
/// <returns></returns>
public static bool HtmlToPdf(string Url, string outputFilename)
{
    // assemble destination PDF file name
    string filename = ConfigurationManager.AppSettings["ExportFilePath"] + "\\" + outputFilename + ".pdf";

    // get proj no for header
    Project project = new Project(int.Parse(outputFilename));

    var p = new System.Diagnostics.Process();
    p.StartInfo.FileName = ConfigurationManager.AppSettings["HtmlToPdfExePath"];

    string switches = "--print-media-type ";
    switches += "--margin-top 4mm --margin-bottom 4mm --margin-right 0mm --margin-left 0mm ";
    switches += "--page-size A4 ";
    switches += "--no-background ";
    switches += "--redirect-delay 100";

    p.StartInfo.Arguments = switches + " " + Url + " " + filename;

    p.StartInfo.UseShellExecute = false; // needs to be false in order to redirect output
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.RedirectStandardInput = true; // redirect all 3, as it should be all 3 or none
    p.StartInfo.WorkingDirectory = StripFilenameFromFullPath(p.StartInfo.FileName);

    p.Start();

    // read the output here...
    string output = p.StandardOutput.ReadToEnd(); 

    // ...then wait n milliseconds for exit (as after exit, it can't read the output)
    p.WaitForExit(60000); 

    // read the exit code, close process
    int returnCode = p.ExitCode;
    p.Close(); 

    // if 0 or 2, it worked (not sure about other values, I want a better way to confirm this)
    return (returnCode == 0 || returnCode == 2);
}
51
ответ дан 7 November 2019 в 08:28
поделиться
using System;
using System.Diagnostics;
using System.Web;

public partial class pdftest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    private void fn_test()
    {
        try
        {
            string url = HttpContext.Current.Request.Url.AbsoluteUri;
            Response.Write(url);
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = 
                @"C:\PROGRA~1\WKHTML~1\wkhtmltopdf.exe";//"wkhtmltopdf.exe";
            startInfo.Arguments = url + @" C:\test"
                 + Guid.NewGuid().ToString() + ".pdf";
            Process.Start(startInfo);
        }
        catch (Exception ex)
        {
            string xx = ex.Message.ToString();
            Response.Write("<br>" + xx);
        }
    }
    protected void btn_test_Click(object sender, EventArgs e)
    {
        fn_test();
    }
}
-1
ответ дан 7 November 2019 в 08:28
поделиться

Вы можете указать wkhtmltopdf отправить его вывод в sout, указав "-" в качестве файла вывода. Затем вы можете прочитать вывод процесса в r esponse stream и избежать проблем с разрешениями при записи в файловую систему.

5
ответ дан 7 November 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: