我已经分配了将单个 PDF 页面转换为 JPEG 的任务。
使用 Magick.NET,我能够在运行项目的任何本地计算机上获得非常不错的转换速度。
我的实时环境在 Amazon 的 Elastic Beanstalk 下,使用 EC2 实例。它是一个 t1.micro 实例,具有 615MB RAM 和约 1.83GHz 的 CPU。
部署我的项目时,我在我的计算机和服务器上都使用Magick.NET x86 Q16
,Ghostscript x86
和。Visual C++ Redistributable VS2012 x86
该代码从 下载 PDFS3 Bucket
并将其保存在本地,因此转换也发生在本地。
这就是它开始变得奇怪的地方。
测试转换 #1 的时间(我还向服务器打开了一个 RDP 窗口进行监控):
- 点击我漂亮闪亮的
Split to images
按钮 - 下载几乎在瞬间完成
image.Read()
,它读取 PDF 需要很长时间才能完成(有时在 2-8 分钟之间),并且每次,我的浏览器都会以空白(白色)页面响应。- 我将浏览器的白页保持原样,然后继续监视服务器。在发生转换的文件夹中,服务器缓慢地开始写入文件夹中的每个 60KB 图像(对于大小为 1.7MB 的 6 页 PDF,整个过程可能需要 5-15 分钟,服务器在那个时候以及稍晚一点)
测试转换#2:
- 用 x64 版本替换了上面描述中提到的所有内容。一样。
测试转换#3/#4:
- 将 Magick.NET x86/x64 Q16替换为 Magick.NET x86/x64 Q8
又是同样的事情。
在每次转换期间,CPU 为 100%,内存约为 70%
我的代码如下:
Dim response As GetObjectResponse = client.GetObject(req)
Try
Using response
Dim dest As String = Path.Combine(Server.MapPath("~/S3"), EnvName)
If Not File.Exists(dest) Then
response.WriteResponseStreamToFile(dest)
End If
End Using
Dim settings As New MagickReadSettings
settings.Density = New MagickGeometry(300, 300)
Dim images As New MagickImageCollection
Using images
images.Read(Server.MapPath("~/S3/" & EnvName & ""), settings)
Dim pageCount As Integer = 1
For Each img As MagickImage In images
img.Resize(700, 900)
img.Format = MagickFormat.Jpeg
img.Trim()
img.Write("~/S3/" & EnvName & "_Page_" & pageCount & ".jpeg")
Literal1.Text &= "Page " & pageCount & " is done" 'For debugging purposes
pageCount += 1
Next
Literal1.Text &= "Success"
End Using
Catch ex As Exception
Literal1.Text = ex.ToString
End Try