Ответ 1
Взгляните на Ghostscript. Вы можете визуализировать PDF с изображениями.
http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/
Мне нужно сохранить документ одной страницы в формате PDF в виде изображения для миниатюры на веб-сайте.
Я общался с PDFSharp и не повезло.
Я пробовал это: http://www.pdfsharp.net/wiki/ExportImages-sample.ashx?AspxAutoDetectCookieSupport=1, но все, что он делает, - это извлечение встроенных изображений в файл PDF, который не является желаемым результатом.
Идеи о том, как это сделать? Кто-нибудь знает хорошую библиотеку, которая может справиться с этим?
Изменить: Пожалуйста, дайте мне знать, почему это такой плохой вопрос. Если у кого-то есть хорошее решение, это будет большой ресурс для многих других людей. Тем более, что поисковые запросы google пусты.
Взгляните на Ghostscript. Вы можете визуализировать PDF с изображениями.
http://www.mattephraim.com/blog/2009/01/06/a-simple-c-wrapper-for-ghostscript/
Ghostscript в настоящее время является стандартом де-факто для рендеринга PDF файлов. Это немного сложно обернуть, даже используя GhostScriptSharp.
Джейсон Морзе написал отличную оболочку С# для рендеринга PDF файлов в качестве плагина к open-source библиотека imageresizing.net.
Если это приложение asp.net, библиотека позволяет визуализировать "на лету", поэтому вы можете просто добавить запрос для получения версии jpeg/png:
/pdfs/letter.pdf?format=jpg&page=2
Вместо этого вы можете использовать управляемый API (в любом типе приложения, а не в asp.net)
ImageBuilder.Current.Build( "letter.pdf", "dest.jpg", новый ResizeSettings ( "format = jpg; page = 2" ));
Плагин PdfRenderer лицензирован GPL, как и Ghostscript.
ABCpdf экспортирует PDF-документы в JPEG с помощью С#. См.: http://www.websupergoo.com/helppdfnet/source/4-examples/19-rendering.htm
(отказ от ответственности: я работаю в Atalasoft и написал много технологий PDF) Если вы используете PdfDecoder в Atalasoft dotImage, это прямолинейно:
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);
}
}
}
Я получил это откуда-то в Интернете - не помню точно, где, но он работает для меня!
Я просто сделал это в хорошей функции.
Он использует API GhostScript (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;
}