Конвертер JPG в PDF на C#

Я хотел бы преобразовать изображение (например, jpg или png) в PDF.

Я проверил ImageMagickNET, но он слишком сложен для моих нужд.

Какие другие решения или код .NET существуют для преобразования изображения в PDF?


person Coppermill    schedule 29.10.2009    source источник
comment
Существует также graphicsmagick.org, который является улучшенной версией ImageMagick (с точки зрения кода). Я не знаю, найдете ли вы для него библиотеки .NET.   -  person csl    schedule 29.10.2009
comment
Это для настольного/серверного/веб-приложения?   -  person o.k.w    schedule 29.10.2009
comment
Это веб-приложение, однако это не имеет значения для типа приложения, поскольку кодирование будет одинаковым.   -  person Coppermill    schedule 30.10.2009


Ответы (8)


iTextSharp делает это довольно чисто и имеет открытый исходный код. Кроме того, у него есть очень хорошая сопроводительная книга автора который я рекомендую, если вы в конечном итоге будете заниматься более интересными вещами, такими как управление формами. Для обычного использования в списках рассылки и группах новостей есть множество ресурсов для примеров того, как делать обычные вещи.

РЕДАКТИРОВАТЬ: как указано в комментарии @Chirag, Ответ @Darin содержит код, который определенно компилируется с текущими версиями.

Пример использования:

public static void ImagesToPdf(string[] imagepaths, string pdfpath)
{
    using(var doc = new iTextSharp.text.Document())
    {
        iTextSharp.text.pdf.PdfWriter.GetInstance(doc, new FileStream(pdfpath, FileMode.Create));
        doc.Open();
        foreach (var item in imagepaths)
        {
            iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(item);
            doc.Add(image);
        }
    }
}

person Ruben Bartelink    schedule 29.10.2009
comment
iTextSharp имеет открытый исходный код, но не бесплатный. Вам придется либо заплатить лицензионный сбор, либо сделать свой собственный код открытым исходным кодом из-за лицензии AGPL, которую они используют. Убедитесь сами здесь: itextpdf.com/terms-of-use/index.php - person ; 05.10.2012
comment
получение ошибки Ошибка 2 «iTextSharp.text.Document»: тип, используемый в операторе использования, должен быть неявно преобразован в «System.IDisposable» - person Chirag; 10.10.2015
comment
@Chirag Я не помню, действительно ли я скомпилировал код в то время или есть вероятность, что вы используете другую версию (вот пример подобного кода, чтобы подтвердить, что в какой-то момент это имело смысл). Однако в целом, если это не Disposable, можно безопасно опустить using. Подождите, взгляните на @Darin answer. Спасибо за указание на одежду Императора :) - person Ruben Bartelink; 10.10.2015
comment
Я уже проверил этот код, есть одна проблема. Процесс не может получить доступ к файлу test.jpg, потому что он используется другим процессом. - person Chirag; 10.10.2015
comment
@Chirag Не исключено, что такая ошибка будет связана с отсутствием Close / Dispose где-то в генерации документа. - person Ruben Bartelink; 11.10.2015

Легко с iTextSharp:

class Program
{
    static void Main(string[] args)
    {
        Document document = new Document();
        using (var stream = new FileStream("test.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
        {
            PdfWriter.GetInstance(document, stream);
            document.Open();
            using (var imageStream = new FileStream("test.jpg", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                var image = Image.GetInstance(imageStream);
                document.Add(image);
            }
            document.Close();
        }
    }
}
person Darin Dimitrov    schedule 29.10.2009
comment
Хорошо, +1 за уборку тоже. Интересно (я не использовал его уже давно), есть ли более чистый способ использования Document w/IDisposable и/или должна ли быть попытка/окончательно защитить Close? Предположительно, нет, если imageStream является фактическим держателем/владельцем ресурса? - person Ruben Bartelink; 29.10.2009
comment
Я получаю, что PdfWriter не существует в текущем контексте - person Ladessa; 14.01.2013
comment
Как добавить ширину и высоту изображения в pdf? - person Vishal Kiri; 09.12.2015
comment
Следующее, по-видимому, работает для уменьшения больших изображений без искажения их размеров: float maxWidth = document.PageSize.Width - document.LeftMargin - document.RightMargin; float maxHeight = document.PageSize.Height - document.TopMargin - document.BottomMargin; if (image.Height › maxHeight || image.Width › maxWidth) image.ScaleToFit(maxWidth, maxHeight); - person user1566694; 05.05.2017

Другой рабочий код, попробуйте

public void ImagesToPdf(string[] imagepaths, string pdfpath)
{
        iTextSharp.text.Rectangle pageSize = null;

        using (var srcImage = new Bitmap(imagepaths[0].ToString()))
        {
            pageSize = new iTextSharp.text.Rectangle(0, 0, srcImage.Width, srcImage.Height);
        }

        using (var ms = new MemoryStream())
        {
            var document = new iTextSharp.text.Document(pageSize, 0, 0, 0, 0);
            iTextSharp.text.pdf.PdfWriter.GetInstance(document, ms).SetFullCompression();
            document.Open();
            var image = iTextSharp.text.Image.GetInstance(imagepaths[0].ToString());
            document.Add(image);
            document.Close();

            File.WriteAllBytes(pdfpath+"cheque.pdf", ms.ToArray());
        }
}
person Community    schedule 10.10.2015
comment
извините, что наткнулся на 5-летний ответ. но строки 3-8 очень помогли мне с моим файлом PDF, в котором было вырезано содержимое изображения. Спасибо! - person Nii; 16.01.2021

Нам очень повезло с PDFSharp (мы используем его для преобразования TIFF и Text в PDF для сотен медицинских заявлений каждый день).

http://pdfsharp.com/PDFsharp/

person Bob Palmer    schedule 29.10.2009
comment
Я использовал PDFSharp, но pdf искажается. Пожалуйста, смотрите мой вопрос stackoverflow.com/questions/15437706/ pdf из растрового изображения неправильного размера - person Ladessa; 18.03.2013

Такую задачу легко решить с помощью библиотеки Docotic.Pdf.

Вот пример, который создает PDF из заданных изображений (на самом деле не только JPG):

public static void imagesToPdf(string[] images, string pdfName)
{
    using (PdfDocument pdf = new PdfDocument())
    {
        for (int i = 0; i < images.Length; i++)
        {
            if (i > 0)
                pdf.AddPage();

            PdfPage page = pdf.Pages[i];
            string imagePath = images[i];
            PdfImage pdfImage = pdf.AddImage(imagePath);

            page.Width = pdfImage.Width;
            page.Height = pdfImage.Height;
            page.Canvas.DrawImage(pdfImage, 0, 0);
        }

        pdf.Save(pdfName);
    }
}

Отказ от ответственности: я работаю на поставщика библиотеки.

person Bobrovsky    schedule 29.04.2012

Вам необходимо установить Acrobat. Проверено на Acrobat DC. Это код VB.net. Из-за того, что эти объекты являются COM-объектами, вы должны сделать «объект освобождения», а не просто «= Ничего». Вы можете преобразовать этот код здесь: https://converter.telerik.com/

Private Function ImageToPDF(ByVal FilePath As String, ByVal DestinationFolder As String) As String
    Const PDSaveCollectGarbage  As Integer = 32
    Const PDSaveLinearized      As Integer = 4
    Const PDSaveFull            As Integer = 1
    Dim PDFAVDoc                As Object = Nothing
    Dim PDFDoc                  As Object = Nothing

    Try
        'Check destination requirements
        If Not DestinationFolder.EndsWith("\") Then DestinationFolder += "\"
        If Not System.IO.Directory.Exists(DestinationFolder) Then Throw New Exception("Destination directory does not exist: " & DestinationFolder)
        Dim CreatedFile As String = DestinationFolder & System.IO.Path.GetFileNameWithoutExtension(FilePath) & ".pdf"
        'Avoid conflicts, therefore previous file there will be deleted
        If File.Exists(CreatedFile) Then File.Delete(CreatedFile)

        'Get PDF document
        PDFAVDoc = GetPDFAVDoc(FilePath)
        PDFDoc = PDFAVDoc.GetPDDoc

        If Not PDFDoc.Save(PDSaveCollectGarbage Or PDSaveLinearized Or PDSaveFull, CreatedFile) Then Throw New Exception("PDF file cannot be saved: " & PDFDoc.GetFileName())
        If Not PDFDoc.Close() Then Throw New Exception("PDF file could not be closed: " & PDFDoc.GetFileName())
        PDFAVDoc.Close(1)
        Return CreatedFile
    Catch Ex As Exception
        Throw Ex
    Finally
        System.Runtime.InteropServices.Marshal.ReleaseComObject(PDFDoc)
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(PDFDoc)
        PDFDoc = Nothing
        System.Runtime.InteropServices.Marshal.ReleaseComObject(PDFAVDoc)
        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(PDFAVDoc)
        PDFAVDoc = Nothing
        GC.Collect()
        GC.WaitForPendingFinalizers()
        GC.Collect()
    End Try
End Function
person AndrewK    schedule 31.03.2020

не уверен, ищете ли вы просто бесплатные решения с открытым исходным кодом или рассматриваете и коммерческие. Но если вы включаете коммерческие решения, есть набор инструментов под названием EasyPDF SDK, который предлагает API для преобразования изображений (а также ряда других типов файлов) в PDF. Он поддерживает C# и его можно найти здесь:

 http://www.pdfonline.com/

Код C# будет выглядеть следующим образом:

 Printer oPrinter = new Printer();

 ImagePrintJob oPrintJob = oPrinter.ImagePrintJob;
 oPrintJob.PrintOut(imageFile, pdfFile);

Чтобы быть полностью прозрачным, я должен заявить, что я работаю на создателей EasyPDF SDK (отсюда и мой псевдоним), поэтому это предложение не лишено личных предубеждений :) Но не стесняйтесь проверить версию eval, если вы заинтересованы. Ваше здоровье!

person yu-chen-pdfonline-com    schedule 02.11.2009

Существует множество инструментов сравнения. Я использую PrimoPDF (БЕСПЛАТНО). файл, и вы распечатываете его в формате PDF на свой диск. работает на винде

person Harry    schedule 29.10.2009
comment
неправильный ответ. он хочет сделать это программно (в частности, на С#). - person Raptor; 29.10.2009