web-dev-qa-db-ja.com

PDFファイルを画像に変換する方法

PDFファイルを画像に変換する必要があります。PDFがマルチページの場合、PDFページ。

Acrobat製品のように課金されないオープンソースソリューションはありますか?

23
loveForEver

次のスレッドはあなたの要求に適しています。 pdfファイルをjpeg画像に変換

1つの解決策は、サードパーティのライブラリを使用することです。 ImageMagickは非常に人気があり、無料で入手することもできます。あなたはそれのための.NETラッパーを得ることができます ここ 。元のImageMagickダウンロードページは here です。

また、このスレッドを確認することもできます: C#のpictureBoxでPDFファイルからページを開く方法

PDF to tiff に変換するこのプロセス)==を使用する場合、このクラスを使用してtiffからビットマップを取得できます。

public class TiffImage
{
    private string myPath;
    private Guid myGuid;
    private FrameDimension myDimension;
    public ArrayList myImages = new ArrayList();
    private int myPageCount;
    private Bitmap myBMP;

    public TiffImage(string path)
    {
        MemoryStream ms;
        Image myImage;

        myPath = path;
        FileStream fs = new FileStream(myPath, FileMode.Open);
        myImage = Image.FromStream(fs);
        myGuid = myImage.FrameDimensionsList[0];
        myDimension = new FrameDimension(myGuid);
        myPageCount = myImage.GetFrameCount(myDimension);
        for (int i = 0; i < myPageCount; i++)
        {
            ms = new MemoryStream();
            myImage.SelectActiveFrame(myDimension, i);
            myImage.Save(ms, ImageFormat.Bmp);
            myBMP = new Bitmap(ms);
            myImages.Add(myBMP);
            ms.Close();
        }
        fs.Close();
    }
}

次のように使用します。

private void button1_Click(object sender, EventArgs e)
{
    TiffImage myTiff = new TiffImage("D:\\Some.tif");
    //imageBox is a PictureBox control, and the [] operators pass back
    //the Bitmap stored at that position in the myImages ArrayList in the TiffImage
    this.pictureBox1.Image = (Bitmap)myTiff.myImages[0];
    this.pictureBox2.Image = (Bitmap)myTiff.myImages[1];
    this.pictureBox3.Image = (Bitmap)myTiff.myImages[2];
}
17

Ghostscript を使用してPDFを画像に変換できます。

Ghostscript。NETから使用するには、 Ghostscript.NET ライブラリ(Ghostscriptの管理されたラッパー)をご覧ください。図書館)。

Ghostscript.NETを使用して[〜#〜] pdf [〜#〜]からimageを生成するには、次を参照してください RasterizerSample

複数の画像を1つの画像に結合するには、次のサンプルを確認してください。 http://www.niteshluharuka.com/2012/08/combine-several-images-to-form-a-single-image-using- c /#

19
HABJAN

PDFエンジンは PDFium と呼ばれ、 "BSD 3-clause"ライセンスの下でオープンソースです。私はこれにより、商用製品で使用する場合の再配布が可能になります。

PdfiumViewernuget )と呼ばれる.NETラッパーがあり、私が試した範囲でうまく動作します。これは、再配布も許可するApacheライセンスに基づいています。

(これは、商用ライセンスが必要な https://pdfium.patagames.com/ と同じ「ラッパー」ではないことに注意してください)。

(他にPDFium .NETラッパー PDFiumSharp がありますが、評価していません。)

IMOのこれまでのところ、これはオープンソースの最良の選択である可能性があります(ビールのように無料)PDF図書館のクローズドソース/商業的性質に制限を課さない仕事をするためのライブラリ私が知っている限りでは、ここでの回答には、その基準を満たすものはないと思います。

6
UuDdLrLrSs

2018年については、PDF C#の画像に変換する方法に関する質問に対する単純な答えはまだありません。多くのライブラリは AGPLでライセンスされたGhostScript を使用します。ほとんどの場合、高価な商用ライセンスは本番用に必要です。

GPLライセンスを持つpoppler 'pdftoppm'ユーティリティを使用するのが良い代替案かもしれません。 C.からSystem.Diagnostics.Processで実行されるコマンドラインツールとして使用できます。 PopplerツールはLinuxの世界ではよく知られていますが、 windows build も使用できます。

Pdftoppmを自分で統合したくない場合は、my PdfRenderer poppler wrapper (クラシック.NET Frameworkと.NET Coreの両方をサポート)を使用できます。無料ではありませんが、価格は非常に手頃です。

5

このnugetパッケージ: https://www.nuget.org/packages/Pdf2Png/

は無料で利用でき、MITライセンスでのみ保護されています。これは非常にオープンです。

私は少しテストしましたが、これはpdfを画像に変換するためのコードです。 (画像をデバッグフォルダーに保存します)。

using cs_pdf_to_image;
using PdfToImage;

    private void BtnConvert_Click(object sender, EventArgs e)
    {
        if(openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            try
            {
                string PdfFile = openFileDialog1.FileName;
                string PngFile = "Convert.png";
                List<string> Conversion = cs_pdf_to_image.Pdf2Image.Convert(PdfFile, PngFile);
                Bitmap Output = new Bitmap(PngFile);
                PbConversion.Image = Output;
            }
            catch(Exception E)
            {
                MessageBox.Show(E.Message);
            }
        }
    }
3

PDFiumSharp について。詳しく説明した後、PDFソリューションからpngファイルを作成できました。

これは私のコードです:

using PDFiumSharp;
using System.Collections.Generic;
using System.Drawing;
using System.IO;

public class Program
{
    static public void Main(String[] args) 
    { 
        var renderfoo = new Renderfoo()
        renderfoo.RenderPDFAsImages(@"C:\Temp\example.pdf", @"C:\temp");
    } 
}



public class Renderfoo
{

public void RenderPDFAsImages(string Inputfile, string OutputFolder)
    {
        string fileName = Path.GetFileNameWithoutExtension(Inputfile);

        using (PDFiumSharp.PdfDocument doc = new PDFiumSharp.PdfDocument(Inputfile))
        {
            for (int i = 0; i < doc.Pages.Count; i++)
            {
                var page = doc.Pages[i];
                using (var bitmap = new System.Drawing.Bitmap((int)page.Width, (int)page.Height))
                {
                    var grahpics = Graphics.FromImage(bitmap);
                    grahpics.Clear(Color.White);
                    page.Render(bitmap);
                    var targetFile = Path.Combine(OutputFolder, fileName + "_" + i + ".png");
                    bitmap.Save(targetFile);
                }
            }


        }
    }

}

初心者の場合、PDFiumラッパーを起動して実行するには、次の手順を実行する必要があります。

  • visual Studioで右クリックして両方のttファイルに対してカスタムコードツールを実行する
  • gDIPlusプロジェクトをコンパイルする
  • コンパイルされたアセンブリを(GDIPlusプロジェクトから)プロジェクトにコピーする
  • プロジェクト内のPDFiumSharpおよびPDFiumsharp.GdiPlusアセンブリの両方を参照する

  • pdfium_x64.dllおよび/またはpdfium_x86.dllが両方ともプロジェクトのoutputdirにあることを確認してください

1
Dominik Sand

.NETStandard 2.1クラスライブラリで PDFiumSharp および ImageSharp を使用しました。

    /// <summary>
    /// Saves a thumbnail (jpg) to the same folder as the pdf file, using dimensions 300x423,
    /// which corresponds to the aspect ratio of 'A' paper sizes like A4 (ratio h/w=sqrt(2))
    /// </summary>
    /// <param name="pdfPath">Source path of the pdf file.</param>
    /// <param name="thumbnailPath">Target path of the thumbnail file.</param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    public static void SaveThumbnail(string pdfPath, string thumbnailPath = "", int width = 300, int height = 423)
    {
        using var pdfDocument = new PdfDocument(pdfPath);
        var firstPage = pdfDocument.Pages[0];

        using var pageBitmap = new PDFiumBitmap(width, height, true);

        firstPage.Render(pageBitmap);

        var imageJpgPath = string.IsNullOrWhiteSpace(thumbnailPath)
            ? Path.ChangeExtension(pdfPath, "jpg")
            : thumbnailPath;
        var image = Image.Load(pageBitmap.AsBmpStream());

        // set the background to white, otherwise it's black. https://github.com/SixLabors/ImageSharp/issues/355#issuecomment-333133991
        image.Mutate(x => x.BackgroundColor(Rgba32.White));

        image.Save(imageJpgPath, new JpegEncoder());
    }
1
tjeerdhans

Android AppCompatのようなデフォルトのライブラリを使用すると、すべてのPDFページを画像に変換できます。この方法は非常に高速で最適化されています。以下のコードPDFページの個別の画像を取得します。非常に高速で速いため、これが役立つ場合があります。

ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.open(new File("pdfFilePath.pdf"), MODE_READ_ONLY);
    PdfRenderer renderer = new PdfRenderer(fileDescriptor);
    final int pageCount = renderer.getPageCount();
    for (int i = 0; i < pageCount; i++) {
        PdfRenderer.Page page = renderer.openPage(i);
        Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(),Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(bitmap, 0, 0, null);
        page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
        page.close();

        if (bitmap == null)
            return null;

        if (bitmapIsBlankOrWhite(bitmap))
            return null;

        String root = Environment.getExternalStorageDirectory().toString();
        File file = new File(root + filename + ".png");

        if (file.exists()) file.delete();
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            Log.v("Saved Image - ", file.getAbsolutePath());
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

================================================== =====

private static boolean bitmapIsBlankOrWhite(Bitmap bitmap) {
    if (bitmap == null)
        return true;

    int w = bitmap.getWidth();
    int h = bitmap.getHeight();
    for (int i =  0; i < w; i++) {
        for (int j = 0; j < h; j++) {
            int pixel =  bitmap.getPixel(i, j);
            if (pixel != Color.WHITE) {
                return false;
            }
        }
    }
    return true;
}
1
Rahul

(免責事項私はSoftware Siglo XXIでこのコンポーネントに取り組みました)

Super Pdf2Image Converterを使用して、PDF in高解像度です。32ビットと64ビットの両方で利用でき、非常に安価で効果的です。ぜひお試しください。

たった1行のコード...

GetImage(outputFileName, firstPage, lastPage, resolution, imageFormat)

Converts specifies pages to image and save them to outputFileName (tiff allows multi-page or creates several files)

こちらをご覧ください: http://softwaresigloxxi.com/SuperPdf2ImageConverter.html

0
M. Cota