Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将PDF导出为C格式的JPG#_C#_.net_Image_Pdf_Pdfsharp - Fatal编程技术网

C# 将PDF导出为C格式的JPG#

C# 将PDF导出为C格式的JPG#,c#,.net,image,pdf,pdfsharp,C#,.net,Image,Pdf,Pdfsharp,我需要将一页pdf文档保存为网站缩略图的图像 我一直和PDFSharp混在一起,运气不好 我尝试过这个方法:但它所做的只是提取PDF文件中的嵌入图像,这并不是期望的结果 如何做到这一点?有人知道一个好的图书馆可以处理这个问题吗 编辑:请让我知道为什么这是一个如此糟糕的问题。如果有人对此有一个很好的解决方案,它将是许多其他人的一个巨大资源。尤其是谷歌搜索结果是空的。看看Ghostscript。您可以使用它将PDF渲染为图像 (免责声明:我为Atalasoft工作,写了很多PDF技术) 如果在dot

我需要将一页pdf文档保存为网站缩略图的图像

我一直和PDFSharp混在一起,运气不好

我尝试过这个方法:但它所做的只是提取PDF文件中的嵌入图像,这并不是期望的结果

如何做到这一点?有人知道一个好的图书馆可以处理这个问题吗


编辑:请让我知道为什么这是一个如此糟糕的问题。如果有人对此有一个很好的解决方案,它将是许多其他人的一个巨大资源。尤其是谷歌搜索结果是空的。

看看Ghostscript。您可以使用它将PDF渲染为图像

(免责声明:我为Atalasoft工作,写了很多PDF技术) 如果在dotImage中使用PdfDecoder,这是很简单的:

public void PdfToJpegThumb(Stream srcStream, int pageNo, int maxDimension, Stream dstStream)
{
    PdfDecoder decoder = new PdfDecoder();
    decoder.Resolution = 96; // reduce default resolution to speed up rendering
    // render page
    using (AtalaImage pdfimage = decoder.read(srcStream, pageNo, null)) {
        Thumbnail tn = new Thumbnail(maxDimension, maxDimension);
        // make a thumbnail image
        using (AtalaImage tnImage = tn.Create(pdfImage)) {
            // save it
            tnImage.Save(dstStream, new JpegEncoder(), null);
        }
    }
}

ABCpdf使用C#将PDF文档导出为JPEG格式。请看:

我从网络上的某个地方得到了这个-不记得确切的位置,但它对我有用
我刚刚把它变成了一个很好的函数。

它使用GhostScript API(GSdll32.dll)

imageFormat参数的示例有“jpeg”、“tiff32nc”等。

    #region GhostScript API functions
    [DllImport("gsdll32.dll", EntryPoint = "gsapi_new_instance")]
    private static extern int CreateAPIInstance(out IntPtr pinstance,
                                            IntPtr caller_handle);

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_init_with_args")]
    private static extern int InitAPI(IntPtr instance, int argc, IntPtr argv);

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_exit")]
    private static extern int ExitAPI(IntPtr instance);

    [DllImport("gsdll32.dll", EntryPoint = "gsapi_delete_instance")]
    private static extern void DeleteAPIInstance(IntPtr instance);
    #endregion

    public bool CreateImage(string inputPath, string outputPath, string imageFormat, int firstPage, int lastPage, int width, int height)
    {
        bool result = false;
        try
        {
            string[] args = GetArgs(inputPath, outputPath, imageFormat, firstPage, lastPage, width, height);
            var argStrHandles = new GCHandle[args.Length];
            var argPtrs = new IntPtr[args.Length];

            // Create a handle for each of the arguments after 
            // they've been converted to an ANSI null terminated
            // string. Then store the pointers for each of the handles
            for (int i = 0; i < args.Length; i++)
            {
                argStrHandles[i] = GCHandle.Alloc(StringToAnsi(args[i]), GCHandleType.Pinned);
                argPtrs[i] = argStrHandles[i].AddrOfPinnedObject();
            }

            // Get a new handle for the array of argument pointers
            var argPtrsHandle = GCHandle.Alloc(argPtrs, GCHandleType.Pinned);

            // Get a pointer to an instance of the GhostScript API 
            // and run the API with the current arguments
            IntPtr gsInstancePtr;
            CreateAPIInstance(out gsInstancePtr, IntPtr.Zero);
            InitAPI(gsInstancePtr, args.Length, argPtrsHandle.AddrOfPinnedObject());

            // Cleanup arguments in memory
            for (int i = 0; i < argStrHandles.Length; i++)
                argStrHandles[i].Free();

            argPtrsHandle.Free();

            // Clear API
            ExitAPI(gsInstancePtr);
            DeleteAPIInstance(gsInstancePtr);

            result = true;
        }
        catch(Exception e)
        {
            throw e;
        }
        return result;
    }
#区域重影脚本API函数
[DllImport(“gsdll32.dll”,EntryPoint=“gsapi\u新实例”)]
私有静态外部int CreateAPIInstance(out IntPtr pinstance,
IntPtr调用程序(U句柄);
[DllImport(“gsdll32.dll”,EntryPoint=“gsapi_init_with_args”)]
私有静态外部intinitapi(IntPtr实例、intargc、IntPtr argv);
[DllImport(“gsdll32.dll”,EntryPoint=“gsapi_exit”)]
私有静态外部intexitapi(IntPtr实例);
[DllImport(“gsdll32.dll”,EntryPoint=“gsapi\u delete\u实例”)]
私有静态外部void DeleteAPIInstance(IntPtr实例);
#端区
public bool CreateImage(字符串输入路径、字符串输出路径、字符串图像格式、int firstPage、int lastPage、int width、int height)
{
布尔结果=假;
尝试
{
字符串[]args=GetArgs(inputPath、outputPath、imageFormat、firstPage、lastPage、width、height);
var argStrHandles=新的GCHandle[args.Length];
var argPtrs=new IntPtr[args.Length];
//为后面的每个参数创建句柄
//它们已被转换为ANSI null终止
//然后存储每个句柄的指针
for(int i=0;i
Ghostscript目前是呈现PDF的事实标准。即使使用GhostScriptSharp,包装也有点棘手

Jason Morse写了一篇文章作为开源软件的插件

如果是asp.net应用程序,则该库允许动态渲染,因此您只需添加查询字符串即可获得jpeg/png版本:

/pdfs/letter.pdf?格式=jpg&page=2

您也可以改用托管API(在任何应用程序类型中,而不是特定于asp.net的应用程序中)

ImageBuilder.Current.Build(“letter.pdf”、“dest.jpg”、新的大小设置(“format=jpg;page=2”)


PdfRenderer插件是GPL许可的,就像Ghostscript一样。

你在PDFSharp中尝试了什么?这里有一个例子:向我们展示你的尝试。我们会帮你的。谢谢你的反对票!我没有尝试过任何东西,除了你链接的示例,该示例提取PDF中的图像,而不是渲染PDF并将其输出到图像。这就是我提出这个问题的原因:我看不到在iTextSharp或PDFSharp中实现这一点的方法。我在谷歌上搜索了很多,结果空手而归。PDFsharp无法呈现PDF文件——这就是创建缩略图所需的。此信息可在常见问题解答中找到。你已经发现Ghostscript可以做到这一点。我没有投反对票,但我可以看出这是一个糟糕的问题,因为在SO中它已经被问了很多次。只需搜索“[pdf][c#]缩略图”就可以得到10个结果。效果就像冠军一样。我建议获取源代码。它更容易理解,而且与博客上的示例也有点不同。唯一的问题是你必须知道所需的宽度/高度。我想我会努力找出从哪里收集到这些信息的。我对这个解决方案并不痴迷,除了它能起作用。如果有人有更好的解决方案,请告诉我们,我会给你打勾。你在pdf上获得页面大小的解决方案是什么?如果不花2000多美元,那就太好了=PI将对此进行研究,看看它是否比使用Ghostscript更干净(必须如此)。谢谢它是从一个地方来的。此外,您还缺少所有的帮助器方法,如“GetArgs”etcThanks,我将在今天进行检查。