2012-04-23

PDF轉縮圖 用 ASP.NET for VB

因之前平台開發時需要"PDF轉縮圖",所以就試著做出此功能

接下來先看使用的效果。



主畫面
選取PDF檔

選取完成後會出現檔名

按下上傳及顯示,我這裡是寫在一起的,也可以寫分開
出現縮圖後,點選縮圖,出現放大圖,可以按右上方NEXT鍵直接下一張

檔案的狀況
資料夾內的狀況


接下來看程式碼:

前端HTML:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

  <script src="js/1.2.6/full/jquery.tools.min.js"></script>

     <script type="text/javascript" src="js/jquery.js"></script>

    <script type="text/javascript" src="js_lightbox/jquery.lightbox-0.5.js"></script>  <!--JQuery外掛-->

    <link rel="stylesheet" type="text/css" href="js_lightbox/jquery.lightbox-0.5.css" media="screen" /> <!--JQuery外掛的css檔-->



     <script type="text/javascript">

         $(function () {

             $('#gallery a').lightBox();//JQuery Lightbox外掛

         });

    </script>



    <style type="text/css">

        .style1

        {

            width: 100%;

        }

        .style2

        {

            width: 10%;

        }

    </style>

</head>

<body>

    <form id="form1" runat="server">

    <div>

   

        <table class="style1">

            <tr>

                <td class="style2" style="text-align: right;">

                    PDF file:</td>

                <td>

&nbsp;<asp:FileUpload ID="FileUpload1" runat="server" />

                </td>

            </tr>

            <tr>

                <td class="style2" style="text-align: right">

                    PDF 縮圖:</td>

                <td>

                    <asp:Panel ID="gallery" runat="server" Height="500px" ScrollBars="Auto">

                        <br />

                    </asp:Panel>

                </td>

            </tr>

            <tr>

                <td class="style2">

                    &nbsp;</td>

                <td>

                    <asp:Button ID="Button1" runat="server" Text="上傳 + 顯示" Width="100px" />

                    <asp:Label ID="Label1" runat="server"></asp:Label>

                </td>

            </tr>

        </table>

   

    </div>

    </form>

</body>

</html>

後端Default.aspx.vb程式碼:

Imports PDFConvert

Imports System.IO



Partial Class _Default

    Inherits System.Web.UI.Page



    Dim converter As New PDFConvert.PDFConvert



    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

     



    End Sub



    Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click



        Dim version As GhostScriptRevision = converter.GetRevision()





        '-- 註解:先設定好檔案上傳的路徑,這是Web Server電腦上的目錄。

        Dim saveDir As String = FileUpload1.FileName + "\"      '資料夾用檔案名稱區分

        Dim appPath As String = Request.PhysicalApplicationPath 'SERVER實體 Path



        Dim my_air As String = appPath + saveDir

        '*******************************************



        '--如果這目錄不存在,就建立它。

        If Not Directory.Exists(my_air) Then

            Directory.CreateDirectory(my_air)

        End If



        If (FileUpload1.HasFile) Then

            Dim fileName As String = FileUpload1.FileName



            saveDir = my_air & fileName



            FileUpload1.SaveAs(saveDir)



            Label1.Text = "上傳成功,檔名---- " & fileName

        Else

            Label1.Text = "請先挑選檔案之後,再來上傳"

        End If





        '預先PDF轉JPG圖片,和PDF放在同一個資料夾

        ConvertSingleImage(saveDir)





        '把PDF的縮圖放到動態的image上



        '圖片的路徑

        Dim root As String = Server.MapPath("~/" + FileUpload1.FileName)

        '抓取該資料夾內所有檔案,因為會有pdf及jpg檔所以限制只取jpg檔

        Dim files As String() = Directory.GetFiles(root, "*.jpg")

        Me.gallery.Controls.Clear()

        ' 使用 Panel 和 Image 控件

        For index As Integer = 0 To files.Length - 1





            '動態加圖片到panel中

            Dim tempImg As New Image()

            Dim tempA As New HyperLink()

            tempImg.ID = "img_" & System.IO.Path.GetFileNameWithoutExtension(files(index))

            '得到圖片的路徑

            Dim imgPath As String = "~/" & FileUpload1.FileName & "/" & Path.GetFileName(files(index))

            '獲取圖片的位置

            tempImg.ImageUrl = imgPath

            tempImg.Attributes.Add("rel", "#photo" & CStr(index))

            '對圖片進行設置

            Dim image As System.Drawing.Image = DirectCast(New System.Drawing.Bitmap(Server.MapPath(imgPath)), System.Drawing.Image)

            '獲取圖片的寬度  和  高度

            Dim width As Integer = image.Size.Width

            Dim height As Integer = image.Size.Height

            '图片的新寬度  和  高度

            Dim newWidth As Integer = 200

            Dim newHight As Integer = 0

            If width > 200 Then

                '圖片的高度等比例縮放

                newHight = CInt(Math.Truncate(CDec(height) * 200 / width))

            End If

            If newHight <> 0 Then

                tempImg.Height = newHight

                tempImg.Width = newWidth

            Else

                tempImg.Height = height

                tempImg.Width = width

            End If



            'JQuery放大圖片需要,把Image放到<a>連接內

            tempA.Controls.Add(tempImg)



            '再把<a>連接掛上圖片路徑

            tempA.NavigateUrl = imgPath



            '再把<a>放到panel內

            Me.gallery.Controls.Add(tempA)

            '動態圖片到panel中

            '釋放image使用資源

            image.Dispose()

            '設置圖片顯示的行數

            Dim lt As New Literal()

            lt.Text = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"

            Me.gallery.Controls.Add(lt)

            '每行顯示5個圖片

            If (index + 1) Mod 5 = 0 Then

                Dim ltBR As New Literal()

                ltBR.Text = "<br/>"

                Me.gallery.Controls.Add(ltBR)

            End If



        Next



    End Sub



    Private Sub ConvertSingleImage(filename As String)

        Dim Converted As Boolean = False



        converter.OutputToMultipleFile = True

        converter.FirstPageToConvert = -1

        converter.LastPageToConvert = -1

        converter.FitPage = False

        converter.JPEGQuality = 100

        converter.OutputFormat = "jpeg"



        Dim input As FileInfo = New FileInfo(filename)

        Dim output As String = String.Format("{0}\\{1}{2}", input.Directory, input.Name, ".jpg")



        While File.Exists(output)

            output = output.Replace(".jpg", String.Format("{1}{0}", ".jpg", DateTime.Now.Ticks))

        End While



        Converted = converter.Convert(input.FullName, output)



        If Converted Then

          

        Else

          

        End If

    End Sub



End Class

注意:有兩個dll檔要掛進來(加入參考)

dll檔下載:http://dl.dropbox.com/u/34994974/PDFtoImage.rar

後記:
           幾點需要注意一下,此轉換版本是32位元的版本,因為圖片有版本之分
像我開發是在XP上面開發的,但放到window server 2008平台上面就會出現版本錯誤
,解法有兩個,第一是改寫成64位元版(要重寫,會要我的命的XD)、第二個方法是
在IIS上改套用的應用程式集為整合式的(如下圖),以上就是為您介紹的PDF轉縮圖,
不了解的歡迎來信,謝謝。

更新:
           最近在轉檔時如果PDF檔案過大會出錯之問題,解法為:在webConfig的 
           裡面加入 就解決了。

2 則留言:

  1. 想請問一下大大~
    因為我也剛好在研究pdf轉圖片的功能
    但是測試時候都會出現

    在 DLL 'gsdll32.dll' 中找不到名稱為 'gsapi_revision' 的進入點。

    這個錯誤,不知該如何解決,能請大大幫忙一下ㄇ~

    謝謝

    回覆刪除
    回覆
    1. 把Button1_Click內的Dim version As GhostScriptRevision = converter.GetRevision()註解掉看看。

      刪除

您的寶貴建議是我前進的動力!