为什么wkhtmltopdf会在pdf文件中显示链接地址?

时间:2013-07-18 06:29:03

标签: twitter-bootstrap wkhtmltopdf

我尝试使用wkhtmltopdf 0.10.0 rc2从网页导出pdf文件。但是我发现了很多问题:

1,当导出基于Bootstrap CSS库的页面时,它总是在'a'标签内显示链接地址。例如,“linkname”将在'linkname'后面显示'./somepage.html'。我可以删除吗?

2,缺少页面的某些元素。以stackoverflow页面为例,运行

wkhtmltopdf http://stackoverflow.com/questions/10307043/rails-3-and-pdfkit-how-to-specify-page-size/ ./test.pdf 

将呈现页面中的大多数元素。但是“stackoverflow”标识之后的5个按钮消失了。我怎么能避免这种情况?

3,如何导出需要登录的页面?

在这3个问题中,我对第一个问题最感兴趣。我google了很多但没有结果。所以我会接受第一个答案。非常感谢提前。

2 个答案:

答案 0 :(得分:2)

回答第一个问题;链接位置将附加到链接文本,因为它使用以下a:link:after, a:visited:after { content: " (" attr(href) ") "; } 规则(或某些类似的变体):

@media print
{

  a:link:after, a:visited:after
  {
    content: "";
  }

}

所以要阻止这种情况发生,只需将以下内容添加到您的页面中:

$(document).ready(function () {
    $("#btnsearchHistory").click(function () {
        var txtfrom = $('#txtfrom').val();
        var txtto = $('#txtto').val();
        var terminalId = $('#txtMerchantAccounthistory').val();
        var SOFAccount = $('#txtsalesNumber').val();
        var statMsg = $('#drpStatMsg').val();
        var formatedData = '';
        var totalrecords = 0;

        if (txtfrom == "") {
            alert("Select Valid From Date");
            event.returnValue = false;
            return false;
        }
        if (txtto == "") {
            alert("Select Valid To Date");
            event.returnValue = false;
            return false;
        }

        var source = {
            datatype: "json",
            datafields: [
                { name: 'Id' },
                { name: 'TerminalId' },
                { name: 'UserName' },
                { name: 'Error' },
                { name: 'Date' },
                { name: 'SalesAccount' },
                { name: 'BillTypeCode' },
                { name: 'Amount' },
                { name: 'BillerCode' },
                { name: 'BankID' },
                { name: 'ReqId' }

            ],
            sort: function () {
                $("#grid").jqxGrid('updatebounddata', 'sort');
            },
            filter: function () {
                $("#grid").jqxGrid('updatebounddata', 'filter');
            },
            beforeprocessing: function (data) {
                var returnData = {};
                data = data.d;
                totalrecords = data.count;
                returnData.totalrecords = data.count;
                returnData.records = data.data;
                if (data.data != null) {
                    return returnData;
                }

                return data;

            },
            type: 'Get',
            sortcolumn: 'Id',
            sortdirection: 'desc',
            formatdata: function (data) {
                data.pagenum = data.pagenum || 0;
                data.pagesize = data.pagesize || 10;
                data.sortdatafield = data.sortdatafield;
                data.sortorder = data.sortorder || 'asc';
                data.filterscount = data.filterscount || 0;
                formatedData = buildQueryString(data);
                return formatedData;
            },
            url: '/WS/WS.asmx/SearchTransferLog',
            data: { fromDate: JSON.stringify(txtfrom), toDate: JSON.stringify(txtto), terminalId: JSON.stringify(terminalId), SOFAccount: JSON.stringify(SOFAccount), statMsg: JSON.stringify(statMsg) },
        };

        var dataAdapter = new $.jqx.dataAdapter(source, {
            contentType: 'application/json; charset=utf-8',
            loadError: function (xhr, status, error) {
                alert(error);
            }
        });


        var cols = [
            { text: 'Id', dataField: 'Id', hidden: true },
            { text: 'رقم حساب التاجر', dataField: 'TerminalId', width: '28%', align: "right", cellsalign: "right", hidden: true },
            { text: '', dataField: 'UserName', width: '28%', align: "right", cellsalign: "right", hidden: true },
            { text: 'الحالة', dataField: 'Error', width: '28%', align: "right", cellsalign: "right" },
            { text: 'تاريخ الدفع', dataField: 'Date', width: '18%', align: "right", cellsalign: "right" },
            { text: 'حساب الدفع', dataField: 'SalesAccount', width: '15%', align: "right", cellsalign: "right" },
            { text: 'توقعات الاغلاق على', dataField: 'BillTypeCode', width: '15%', align: "right", cellsalign: "right", hidden: true },
            { text: 'القيمة المحولة', dataField: 'Amount', width: '15%', align: "right", cellsalign: "right" },
            { text: 'توقعات الاغلاق على', dataField: 'BillerCode', width: '15%', align: "right", cellsalign: "right", hidden: true },
            { text: 'توقعات الاغلاق على', dataField: 'BankID', width: '15%', align: "right", cellsalign: "right", hidden: true },
            { text: 'توقعات الاغلاق على', dataField: 'ReqId', width: '15%', align: "right", cellsalign: "right", hidden: true },
            {
                text: '', datafield: 'Edit', columntype: 'button', width: '100px', cellsrenderer: function () {
                    return "استعلام عن الحالة";
                }, buttonclick: function (row) {
                    var id = $("#detail_grid").jqxGrid('getcellvalue', row, "Id");
                    alert(id);
                    //RefreshTransferStatus();
                }
            }

        ];

        $("#detail_grid").jqxGrid({
            source: dataAdapter,
            pageable: true,
            autoheight: true,
            virtualmode: true,
            sorttogglestates: 1,
            filterable: true,
            sortable: true,
            rtl: true,
            altrows: true,
            width: '100%',
            rendergridrows: function (args) {
                return args.data;
            },
            columns: cols
        });
    });
});

答案 1 :(得分:0)

由于您实际上只是在寻找问题1的答案,我想添加一条评论,但它太长了。通常这里每个问题都有1个问题:)

1:你是否有链接到在线的东西,这会发生复制?我只是尝试了http://twitter.github.io/bootstrap/getting-started.html#examples并且它有效(非常难看,但仍然)。

2:你在linux上吗?对于我在Win 7上它工作得很好。你的意思是“问题”,“标签”,“用户”等按钮?我无法看到它们是如何工作的,但如果碰巧是JS生成的话,可能会尝试使用--javascript-delay 5000

3:取决于。您可能希望使用--cookie-jar进行身份验证,但我个人不喜欢它。如果打印命令的事件处理程序在您的应用程序中,您可以尝试使用当前登录的凭据来呕吐应用程序中页面的临时文件或内存流,然后将其直接提供给wkhtmltopdf。这是除非您的应用程序需要wkhtmltopdf才能显示登录,在这种情况下您需要cookie jar或单个cookie。 cookie将包含您登录用户所拥有的相同登录数据,因此它类似于会话劫持,这意味着如果您进行任何安全检查,它甚至可能无法正常工作。有关Cookie信息,请参阅http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html。有关cookie jar的更多信息:https://code.google.com/p/wkhtmltopdf/issues/detail?id=356此外,还有一个相关的SO问题,可以帮助您:wkhtmltopdf Log in to asp.net web app