Windows 8.1 Pro,Visual Studio 2015 Update 3,C#,.NET Framework 4.5。 Ghostscript.NET(最新),GhostScript 9.20。
我将PDF转换为PDF。哈。好吧,我正在做一个可编辑的" PDF" hard" PDF无法编辑且质量较低。这个过程是我采用可编辑的PDF,将其保存为PNG文件的x页,将这些PNG文件转换为多页TIFF,然后将多页TIFF转换为我需要的PDF。
这适用于Visual Studio 2012,早期的GhostScript .NET和GS 9.10之一。
public static Tuple<string, List<string>> CreatePNGFromPDF(string inputFile, string outputfile)
{
Tuple<string, List<string>> t = null;
List<string> fileList = new List<string>();
string message = "Success";
string outputFileName = string.Empty;
int desired_x_dpi = 96;
int desired_y_dpi = 96;
try
{
using (GhostscriptViewer gsViewer = new GhostscriptViewer())
{
gsViewer.Open(inputFile);
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer(gsViewer))
{
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
using (System.Drawing.Image img = rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber))
{
outputFileName = outputfile.Replace(".png", string.Empty) + "_page_" + pageNumber.ToString() + ".png";
img.Save(outputFileName, ImageFormat.Png);
if (!fileList.Contains(outputFileName))
{
fileList.Add(outputFileName);
}
}
}
}
}
}
catch (Exception ex)
{
message = ex.Message;
}
t = new Tuple<string, List<string>>(message, fileList);
return t;
}
现在这行失败了:
using (System.Drawing.Image img = rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber))
处理第二个页面时。第一页工作正常。
我下载了GhostScript.NET的源代码,将其添加到我的解决方案,调试等等,并花了很长时间试图解决这个问题。
然后我决定将功能分开,并让我可以在一个简单的控制台应用程序中进一步检查:
static void Main(string[] args)
{
int xDpi = 96;
int yDpi = 96;
string pdfFile = @"Inputfilenamehere.pdf";
GhostscriptVersionInfo gsVersionInfo = GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | GhostscriptLicense.AFPL, GhostscriptLicense.GPL);
List<GhostscriptVersionInfo> gsVersionInfoList = GhostscriptVersionInfo.GetInstalledVersions(GhostscriptLicense.GPL | GhostscriptLicense.AFPL);
try
{
using (GhostscriptViewer gsViewer = new GhostscriptViewer())
{
gsViewer.Open(pdfFile);
using (GhostscriptRasterizer gsRasterizer = new GhostscriptRasterizer(gsViewer))
{
int pageCount = gsRasterizer.PageCount;
for (int i = 0; i < pageCount; i++)
{
Image img = gsRasterizer.GetPage(xDpi, yDpi, i + 1);
}
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
瞧,没问题。不同之处在于我没有在using
声明中声明我的图像。
每当类实现IDisposable
时,我总是尝试成为一名优秀的男孩开发人员并使用using语句。
所以,我删除了使用的使用,我得到了我一直想要的低质量PDF。我现在的生活很美好。
using (GhostscriptViewer gsViewer = new GhostscriptViewer())
{
gsViewer.Open(inputFile);
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer(gsViewer))
{
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
System.Drawing.Image img = rasterizer.GetPage(desired_x_dpi, desired_y_dpi, pageNumber);
outputFileName = outputfile.Replace(".png", string.Empty) + "_page_" + pageNumber.ToString() + ".png";
img.Save(outputFileName, ImageFormat.Png);
if (!fileList.Contains(outputFileName))
{
fileList.Add(outputFileName);
}
}
}
}
请注意,如果我在img.Dispose()
循环结束时调用for
,我会再次收到同样的错误!
我最好的猜测是我的问题不是GhostScript或GhostScript.NET问题。我是坚持盲目使用&#34;使用&#34;如果类实现IDisposable
的语句?我一直都明白,最好的做法是将实施IDisposable
的任何内容用using
语句包起来放弃泄密等。
因此,我的问题:任何想法为什么我得到&#34;参数无效&#34;我在System.Drawing.Image
声明中初始化using
课程时的例外情况,但是当我不在时?我更想了解这一点。
更好的是,如果有人知道如何获得此功能并确保我正确处理我的对象,那将是最好的。
当我搜索信息时,我对这个特定主题没有太多了解。我确实找到一个other StackOverflow post关于某人使用具有相同错误的using语句中的图形对象。我想知道是否有关系。我还注意到I should be using Dispose(),但这似乎导致了问题,我需要这个工作。
仅供参考,对于任何感兴趣的人,GhostScript.NET代码中的GhostscriptInterprester.cs中会出现实际错误:
方法:public void Run(string str)
str is&#34; Page pdfshowpage_init pdfshowpage_finish&#34;
// GSAPI: run the string
int rc_run = _gs.gsapi_run_string(_gs_instance, str, 0, out exit_code);
答案 0 :(得分:0)
我至少找到了失败的根本原因。我的GhostscriptRasterizer对象的值为&#39; 0&#39;设置高度点和宽度点。
var rasterizer = new GhostscriptRasterizer();
rasterizer.CustomSwitches.Add("-dDEVICEWIDTHPOINTS=" + widthPoints);
rasterizer.CustomSwitches.Add("-dDEVICEHEIGHTPOINTS=" + heightPoints);
一旦我将高度和宽度都设置为有效的非零值,问题就得到了解决。