【问题标题】:creating turnjs instance before add any pages在添加任何页面之前创建 turnjs 实例
【发布时间】:2020-01-17 01:45:01
【问题描述】:

我想从没有封面的第一页添加 pdf 的动态页面。但是,我无法在没有页面的情况下创建 turnjs 实例(封面页已在 html 中硬编码)。它输出错误:

Uncaught (in promise) b {name: "TurnJsError", message: "The page 1 does not exist"}

但是,我们不能在没有声明 turnjs 实例的情况下使用 turnjs 的 addpages 方法。如何做到这一点?

目前,我在 html $('#book') 中硬编码封面页。

<div id="book">
    <div class="cover">
        <h1>Cover</h1>
    </div>
</div>

然后,我创建 turnjs 实例如下:

$('#book').turn({
                   page: 1,
                   autoCenter: true,                                            
                });

然后,我通过以下方式删除封面:

$("#book").turn("removePage", 1);

之后,我开始从 pdf 添加页面。所以,它符合我的要求。

完整代码

<?php
ob_start();
require_once('plugin/tcpdf/tcpdf.php');
$pdf = new TCPDF();
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->AddPage();
$html_p1 = 'Text messaging, or texting, is the act of composing and sending electronic messages, typically consisting of alphabetic and numeric characters, between two or more users of mobile devices, desktops/laptops, or other type of compatible computer. Text messages may be sent over a cellular network, or may also be sent via an Internet connection';
//echo $html;
$pdf->writeHTML($html_p1, true, 0, true, 0);
$pdf->AddPage();
$html_p2 = 'A telephone call is a connection over a telephone network between the called party and the calling party.';
$pdf->writeHTML($html_p2, true, 0, true, 0);
$pdf->AddPage();
$html_p3 = 'On the Internet, @ (pronounced "at" or "at sign" or "address sign") is the symbol in an e-mail address that separates the name of the user from the users Internet address, as in this hypothetical e-mail address example: msmuffet@tuffet.org. In business, @ is a symbol meaning "at" or "each."';
$pdf->writeHTML($html_p3, true, 0, true, 0);
$base64PdfString = $pdf->Output('', 'E');
$base64PdfArray  = explode("\r\n", $base64PdfString);
$base64          = '';
for($i = 5; $i < count($base64PdfArray); $i++){
    $base64 .= $base64PdfArray[$i];
}
?>

<!doctype html>
<html>
    <head>
        <style type="text/css">
            body
            {
                background: #ccc;
            }
            #book
            {
                width: 800px;
                height: 500px;
            }

            #book .turn-page
            {
                background-color: white;
            }

            #book .cover
            {
                background: #333;
            }

            #book .cover h1
            {
                color: white;
                text-align: center;
                font-size: 50px;
                line-height: 500px;
                margin: 0px;
            }

            #book .loader
            {
                background-image: url(loader.gif);
                width: 24px;
                height: 24px;
                display: block;
                position: absolute;
                top: 238px;
                left: 188px;
            }

            #book .data
            {
                text-align: center;
                font-size: 40px;
                color: #999;
                line-height: 500px;
            }

            #controls
            {
                width: 800px;
                text-align: center;
                margin: 20px 0px;
                font: 30px arial;
            }

            #controls input, #controls label
            {
                font: 30px arial;
            }

            #book .odd
            {
                background-image: -webkit-linear-gradient(left, #FFF 95%, #ddd 100%);
                background-image: -moz-linear-gradient(left, #FFF 95%, #ddd 100%);
                background-image: -o-linear-gradient(left, #FFF 95%, #ddd 100%);
                background-image: -ms-linear-gradient(left, #FFF 95%, #ddd 100%);
            }

            #book .even
            {
                background-image: -webkit-linear-gradient(right, #FFF 95%, #ddd 100%);
                background-image: -moz-linear-gradient(right, #FFF 95%, #ddd 100%);
                background-image: -o-linear-gradient(right, #FFF 95%, #ddd 100%);
                background-image: -ms-linear-gradient(right, #FFF 95%, #ddd 100%);
            }
        </style>
        <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
        <script type="text/javascript" src="plugin/turnjs4/lib/turn.min.js"></script>
        <script type="text/javascript" src="plugin/pdfjs_ex/pdf.js"></script>
        <script>
            const b64toBlob = (b64Data, contentType='', sliceSize=512) =>
            {
                const byteCharacters = atob(b64Data);
                const byteArrays = [];

                for (let offset = 0; offset < byteCharacters.length; offset += sliceSize)
                {
                    const slice = byteCharacters.slice(offset, offset + sliceSize);
                    const byteNumbers = new Array(slice.length);
                    for (let i = 0; i < slice.length; i++)
                    {
                        byteNumbers[i] = slice.charCodeAt(i);
                    }
                    const byteArray = new Uint8Array(byteNumbers);
                    byteArrays.push(byteArray);
                }

                const blob = new Blob(byteArrays, {type: contentType});
                return blob;
            }
            function addPage(page, book, pdf_doc)
            {
                if (!book.turn('hasPage', page))
                {
                    var element = $('<div />', {'class': 'page '+((page%2==0) ? 'odd' : 'even'), 'id': 'page-'+page}).html('<i class="loader"></i>');
                    book.turn('addPage', element, page);                                        
                    pdf_doc.getPage((page)).then(function(p)
                                    {
                                        var scale = 1;
                                        var viewport = p.getViewport(scale);

                                        var pag1        =document.createElement('canvas');
                                        pag1.id         ='Pg_1';
                                        var context1    =pag1.getContext('2d');
                                        pag1.height     =viewport.height;
                                        pag1.width      =viewport.width;

                                        var renderContext =
                                        {
                                            canvasContext: context1,
                                            viewport: viewport
                                        };

                                        p.render(renderContext).then(function()
                                            {
                                                pag1.toBlob(function(blob)
                                                {
                                                    var burl                        =URL.createObjectURL(blob); 

                                                setTimeout(function()
                                                    {
                                                        element.html('<div style="background-image:url('+burl+'); width: 400px; height: 500px; background-size: cover;"></div><div style="top: 0px; left: 0px; overflow: hidden; z-index: 1; width: 461px; height: 600px;"></div>');

                                                    }, 1000);
                                                })
                                            })
                                    })
                }
            }
        </script>

    </head>
    <body>

        <div id="book">
            <div class="cover">
                <h1>
                    Cover
                </h1>
            </div>
        </div>


        <script type="text/javascript">
            $(window).ready(function()
                {

                    const contentType   ='application/pdf';
                    const b64Data       ='<?php echo $base64;?>';
                    const blob          =b64toBlob(b64Data, contentType);

                    const blobUrl       =URL.createObjectURL(blob);

                    PDFJS.getDocument({ url: blobUrl }).then(function(pdf_doc)
                    {
                        __PDF_DOC       = pdf_doc;
                        __TOTAL_PAGES   = __PDF_DOC.numPages;

                        $('#book').turn({
                                        page: 1,
                                        autoCenter: true,                                           
                                        });

                        var list = [];
                        for (var i = 1; i <= __TOTAL_PAGES; i++) 
                        {
                            list.push(i);
                        }
                        $("#book").turn("removePage", 1);
                        for (page = 0; page<list.length; page++)                        
                        addPage(list[page], $("#book"),pdf_doc);
                    })  
                });

            $(window).bind('keydown', function(e)
                {
                    if (e.target && e.target.tagName.toLowerCase()!='input')
                    if (e.keyCode==37)
                    $('#book').turn('previous');
                    else if (e.keyCode==39)
                    $('#book').turn('next');

                });

        </script>


    </body>
</html>

但是,我仍然想知道如何创建没有页面的turnjs实例并在添加所有页面后显示为翻书。

【问题讨论】:

    标签: pdf.js turnjs turn.js


    【解决方案1】:

    您很可能缺少 1 行,即附加您在 addpage() 函数中创建的元素, 你应该使用

    book.append(customDiv);
    //OR you can write same thing as:
    $('#book').append(element);
    // So your Code mus be:
    <?php
    ob_start();
    require_once('plugin/tcpdf/tcpdf.php');
    $pdf = new TCPDF();
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->AddPage();
    $html_p1 = 'Text messaging, or texting, is the act of composing and sending electronic messages, typically consisting of alphabetic and numeric characters, between two or more users of mobile devices, desktops/laptops, or other type of compatible computer. Text messages may be sent over a cellular network, or may also be sent via an Internet connection';
    //echo $html;
    $pdf->writeHTML($html_p1, true, 0, true, 0);
    $pdf->AddPage();
    $html_p2 = 'A telephone call is a connection over a telephone network between the called party and the calling party.';
    $pdf->writeHTML($html_p2, true, 0, true, 0);
    $pdf->AddPage();
    $html_p3 = 'On the Internet, @ (pronounced "at" or "at sign" or "address sign") is the symbol in an e-mail address that separates the name of the user from the users Internet address, as in this hypothetical e-mail address example: msmuffet@tuffet.org. In business, @ is a symbol meaning "at" or "each."';
    $pdf->writeHTML($html_p3, true, 0, true, 0);
    $base64PdfString = $pdf->Output('', 'E');
    $base64PdfArray  = explode("\r\n", $base64PdfString);
    $base64          = '';
    for($i = 5; $i < count($base64PdfArray); $i++){
        $base64 .= $base64PdfArray[$i];
    }
    ?>
    
    <!doctype html>
    <html>
        <head>
            <style type="text/css">
                body
                {
                    background: #ccc;
                }
                #book
                {
                    width: 800px;
                    height: 500px;
                }
    
                #book .turn-page
                {
                    background-color: white;
                }
    
                #book .cover
                {
                    background: #333;
                }
    
                #book .cover h1
                {
                    color: white;
                    text-align: center;
                    font-size: 50px;
                    line-height: 500px;
                    margin: 0px;
                }
    
                #book .loader
                {
                    background-image: url(loader.gif);
                    width: 24px;
                    height: 24px;
                    display: block;
                    position: absolute;
                    top: 238px;
                    left: 188px;
                }
    
                #book .data
                {
                    text-align: center;
                    font-size: 40px;
                    color: #999;
                    line-height: 500px;
                }
    
                #controls
                {
                    width: 800px;
                    text-align: center;
                    margin: 20px 0px;
                    font: 30px arial;
                }
    
                #controls input, #controls label
                {
                    font: 30px arial;
                }
    
                #book .odd
                {
                    background-image: -webkit-linear-gradient(left, #FFF 95%, #ddd 100%);
                    background-image: -moz-linear-gradient(left, #FFF 95%, #ddd 100%);
                    background-image: -o-linear-gradient(left, #FFF 95%, #ddd 100%);
                    background-image: -ms-linear-gradient(left, #FFF 95%, #ddd 100%);
                }
    
                #book .even
                {
                    background-image: -webkit-linear-gradient(right, #FFF 95%, #ddd 100%);
                    background-image: -moz-linear-gradient(right, #FFF 95%, #ddd 100%);
                    background-image: -o-linear-gradient(right, #FFF 95%, #ddd 100%);
                    background-image: -ms-linear-gradient(right, #FFF 95%, #ddd 100%);
                }
            </style>
            <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
            <script type="text/javascript" src="plugin/turnjs4/lib/turn.min.js"></script>
            <script type="text/javascript" src="plugin/pdfjs_ex/pdf.js"></script>
            <script>
                const b64toBlob = (b64Data, contentType='', sliceSize=512) =>
                {
                    const byteCharacters = atob(b64Data);
                    const byteArrays = [];
    
                    for (let offset = 0; offset < byteCharacters.length; offset += sliceSize)
                    {
                        const slice = byteCharacters.slice(offset, offset + sliceSize);
                        const byteNumbers = new Array(slice.length);
                        for (let i = 0; i < slice.length; i++)
                        {
                            byteNumbers[i] = slice.charCodeAt(i);
                        }
                        const byteArray = new Uint8Array(byteNumbers);
                        byteArrays.push(byteArray);
                    }
    
                    const blob = new Blob(byteArrays, {type: contentType});
                    return blob;
                }
                function addPage(page, book, pdf_doc)
                {
                    if (!book.turn('hasPage', page))
                    {
                        var element = $('<div />', {'class': 'page '+((page%2==0) ? 'odd' : 'even'), 'id': 'page-'+page}).html('<i class="loader"></i>');
                        book.turn('addPage', element, page);                                        
                        pdf_doc.getPage((page)).then(function(p)
                                        {
                                            var scale = 1;
                                            var viewport = p.getViewport(scale);
    
                                            var pag1        =document.createElement('canvas');
                                            pag1.id         ='Pg_1';
                                            var context1    =pag1.getContext('2d');
                                            pag1.height     =viewport.height;
                                            pag1.width      =viewport.width;
    
                                            var renderContext =
                                            {
                                                canvasContext: context1,
                                                viewport: viewport
                                            };
    
                                            p.render(renderContext).then(function()
                                                {
                                                    pag1.toBlob(function(blob)
                                                    {
                                                        var burl                        =URL.createObjectURL(blob); 
    
                                                    setTimeout(function()
                                                        {
                                                            element.html('<div style="background-image:url('+burl+'); width: 400px; height: 500px; background-size: cover;"></div><div style="top: 0px; left: 0px; overflow: hidden; z-index: 1; width: 461px; height: 600px;"></div>');
    book.append(element);
    
                                                        }, 1000);
                                                    })
                                                })
                                        })
                    }
                }
            </script>
    
        </head>
        <body>
    
            <div id="book">
                <div class="cover">
                    <h1>
                        Cover
                    </h1>
                </div>
            </div>
    
    
            <script type="text/javascript">
                $(window).ready(function()
                    {
    
                        const contentType   ='application/pdf';
                        const b64Data       ='<?php echo $base64;?>';
                        const blob          =b64toBlob(b64Data, contentType);
    
                        const blobUrl       =URL.createObjectURL(blob);
    
                        PDFJS.getDocument({ url: blobUrl }).then(function(pdf_doc)
                        {
                            __PDF_DOC       = pdf_doc;
                            __TOTAL_PAGES   = __PDF_DOC.numPages;
    
                            $('#book').turn({
                                            page: 1,
                                            autoCenter: true,                                           
                                            });
    
                            var list = [];
                            for (var i = 1; i <= __TOTAL_PAGES; i++) 
                            {
                                list.push(i);
                            }
                            $("#book").turn("removePage", 1);
                            for (page = 0; page<list.length; page++)                        
                            addPage(list[page], $("#book"),pdf_doc);
                        })  
                    });
    
                $(window).bind('keydown', function(e)
                    {
                        if (e.target && e.target.tagName.toLowerCase()!='input')
                        if (e.keyCode==37)
                        $('#book').turn('previous');
                        else if (e.keyCode==39)
                        $('#book').turn('next');
    
                    });
    
            </script>
    
    
        </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 2014-03-06
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多