Создать изображение или шаблон PDF из файла PDF - PullRequest
2 голосов
/ 02 сентября 2011

При использовании библиотеки itextsharp для генерации PDF я наткнулся на этот метод: -

iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(itextsharp.text.pdf.PdfTemplate);

Где мы можем получить экземпляр Image из PdfTemplate. Но я не знаю, как создать PdfTemplate, и нет конструктора, принимающего имя или поток файла pdf.

Почему я хочу это: я хочу создать изображение из файла PDF, а затем преобразовать это изображение в другой файл PDF.

Кто-нибудь знает, как создать объект PdfTemplate?

1 Ответ

6 голосов
/ 02 сентября 2011

К сожалению, PdfTemplate не совсем то, что вы думаете. iText и iTextSharp - это генераторы PDF, но не рендеры PDF, которые вам понадобятся для преобразования PDF в изображение.

Тем не менее, вы все равно можете достичь своей цели, в зависимости от качества, которое вы ищете.

Одним из наиболее распространенных вариантов использования PdfTemplate является подкласс PdfImportedPage. Если вы создадите Image из PdfImportedPage, вы не будете создавать JPG, PNG или что-то еще в растре, у вас будет полная версия вашей страницы, обернутая в Image объект. Это означает, что вы можете применять преобразования, такие как ScaleAbsolute() или что угодно, но когда вы добавляете их в выходной PDF, любой текст все равно будет истинным текстом (и, следовательно, выбираемым). Это та часть, где качество приходит. Если вы начнете масштабировать Image, он будет (математически) масштабироваться идеально, но визуально он может отображаться неправильно в чем-то вроде Adobe Reader. Если вы увеличите масштаб, все будет хорошо, но многие экранные программы не очень хорошо отрисовывают мелкий шрифт. Является ли это проблемой для вас или нет, я не знаю.

В любом случае, приведенный ниже код является полным рабочим примером, предназначенным для iTextSharp 5.1.1.0. Он читает страницу из существующего PDF-файла, масштабирует ее на 50% и добавляет в выходной PDF-файл.

using System;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //PDF file to pull the first page from
            string inputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Input.pdf");
            //PDF file to output
            string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Output.pdf");


            using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                using (Document doc = new Document())
                {
                    using (PdfWriter w = PdfWriter.GetInstance(doc, fs))
                    {
                        //Open our PDF for writing
                        doc.Open();

                        //We need a reader to pull pages from
                        PdfReader r = new PdfReader(inputFile);

                        //Get the first page of our source PDF
                        PdfImportedPage importedPage = w.GetImportedPage(r, 1);

                        //Insert a new page into our output PDF
                        doc.NewPage();

                        //Create an Image from the imported page
                        iTextSharp.text.Image Img = iTextSharp.text.Image.GetInstance(importedPage);

                        //Just to show why we are using an Image, scale the Image to 50% width and height of the original page
                        Img.ScaleAbsolute(importedPage.Width / 2, importedPage.Height / 2);

                        //Add the Image to the page
                        doc.Add(Img);

                        //Close our output PDF
                        doc.Close();
                    }
                }
            }
            this.Close();
        }
    }
}
...