0

当我裁剪我的pdf时,我使用ghostscript在vb.net中将PDF转换为PNG,然后我将其转换为png,但ghostscript在我的图片中保留x和y位置裁剪。

当我在 cmd 中使用 gswin64.exe 时,我已经解决了这个问题:-c "<</Install {-48 -87 translate}>> setpagedevice"

但是当我在我的代码中添加这个命令时使用 dll Ghostcript.NET:oGSImage.CustomSwitches.Add("-c ""<</Install {-48 -87 translate}>> setpagedevice""")我有错误消息

Ghostscript.NET.GhostscriptAPICallException:调用“gsapi_init_with_args”时发生错误:-100

我的设备是 pngAlpha,如果有人可以帮助我:)

4

2 回答 2

0

我找到了一个解决方案:使用所需的作物值初始化变量

Dim nLeft as integer = 20
Dim nRight as integer = 20
Dim nBoth as integer = 40
Dim nUp as integer = 20

我使用 Ghostscript.NET dll 创建了光栅化对象:我在没有 CustomSwitches 的情况下获取高度和宽度大小页面(“-dPDFFitPage”)

Dim rasterize As Rasterizer.GhostscriptRasterizer = New Rasterizer.GhostscriptRasterizer()
    rasterize.Open("PDFPath")
    Dim nHeightBased As Integer = rasterize.GetPage(72, 72, 1).Height
    Dim nWidthBased As Integer = rasterize.GetPage(72, 72, 1).Width
    rasterize.Close()

然后,我使用 CustomSwitches(“-dPDFFitPage”)创建一个新的栅格化以获取高度和宽度大小页面

        rasterize = New Rasterizer.GhostscriptRasterizer()
        rasterize.CustomSwitches.Add("-dPDFFitPage")
        rasterize.Open(cPathPDF)

        Dim nHeightBound As Integer = nHeightBased - rasterize.GetPage(72, 72, 1).Height
        Dim nWidthBound As Integer = nWidthBased - rasterize.GetPage(72, 72, 1).Width
        Dim nWidthPDF As Integer = rasterize.GetPage(72, 72, 1).Width
        Dim nHeightPDF As Integer = rasterize.GetPage(72, 72, 1).Height
        rasterize.Close()

        Dim nWidthCrop As Integer = (nWidthPDF + nWidthBound) - (nLeft + nRight)
        Dim nHeightCrop As Integer = (nHeightPDF + (nHeightBound / 2)) - (nBoth + nUp)

        CropPDF("PathPDF", nLeft, nBoth, nWidthCrop, nHeightCrop)

我创建函数 CropPDF :

现在我们采用 gswinc32.exe 或 gswinc64.exe 和 .dll 并在我的示例中复制/粘贴到新路径中,我使用“PathEXE”

Public Function CropPDF(ByVal cPathPDF As String, ByVal nLeft As Integer, ByVal nBoth As Integer, ByVal nWidthCrop As Integer, ByVal nHeightCrop As Integer)

    Dim cPathWithoutExtension = Path.GetDirectoryName("PDFPath") & "/" & Path.GetFileNameWithoutExtension("PDFPath")

    Dim gsPath As String = HttpContext.Current.Server.MapPath("PathEXE")
        Dim gsArgsList As List(Of String) = New List(Of String)

        gsArgsList.Add("-sDEVICE=pdfwrite")
        gsArgsList.Add(" -dFIXEDMEDIA")
        gsArgsList.Add(" -dDEVICEWIDTHPOINTS=" & nWidthCrop)
        gsArgsList.Add(" -dDEVICEHEIGHTPOINTS=" & nHeightCrop)
        gsArgsList.Add(" -o """ & cPathWithoutExtension & "_Crop.pdf""")
        gsArgsList.Add(" -c ""<</Install {-" & nLeft & " -" & nBoth & " translate} >> setpagedevice """)
        gsArgsList.Add(" -f " & cPathPDF)

        Dim gsArgs As String = String.Join(Nothing, gsArgsList)

        Process.Start(gsPath, gsArgs).WaitForExit()

        Dim OFI As FileInfo = New FileInfo(cPathPDF)
        OFI.Delete()

        Dim DestOFI As FileInfo = New FileInfo(cPathWithoutExtension & "_Crop.pdf")
        DestOFI.MoveTo(cPathPDF)

        Return cPath

End Function

现在与 nLeft nRight nBoth nUp 作物完美合作,希望它能帮助一些人:D

于 2018-06-15T08:13:24.797 回答
0

该特定参数从命令行执行 PostScript,它本身并不是严格的“开关”。把它放在错误的地方,它不会工作,翻译会退出。我的猜测是(或类似的)正在发生的事情,解释器没有按照它想要的方式提供数据。

如果 Ghostscript.NET 允许您这样做,您可以将 -c "" -f 之间的文本放入文本文件中,然后在命令行上运行该文件PDF 文件(即作为参数)。

于 2018-06-13T12:48:05.420 回答