Конвертировать PDF в изображение с высоким разрешением - PullRequest
286 голосов
/ 07 июля 2011

Я пытаюсь использовать программу командной строки convert, чтобы вставить PDF в изображение (JPEG или PNG).Вот один из PDF , который я пытаюсь конвертировать.

Я хочу, чтобы программа обрезала лишние пробелы и вернула изображение достаточно высокого качества, чтобы верхние индексы можно было легко прочитать.

Это моя текущая лучшая попытка .Как видите, обрезка работает нормально, мне просто нужно немного повысить разрешение.Я использую эту команду:

convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg

Я пытался принять следующие сознательные решения:

  • изменить его размер больше (не влияет на разрешение)
  • сделать качество как можно выше
  • использовать -sharpen (я пробовал диапазон значений)

Любые предложения, пожалуйста, при получении разрешенияизображение в финальном PNG / JPEG выше будет с благодарностью!

Ответы [ 15 ]

349 голосов
/ 07 июля 2011

Похоже, что работает следующее:

convert           \
   -verbose       \
   -density 150   \
   -trim          \
    test.pdf      \
   -quality 100   \
   -flatten       \
   -sharpen 0x1.0 \
    24-18.jpg

В результате получается левое изображение .Сравните это с результатом моей первоначальной команды ( изображение справа ):

image image

действительно посмотрите и оцените различия между ними, щелкните правой кнопкой мыши на каждом и выберите "Открыть изображение в новой вкладке ..." .)

Также учитывайте следующие факты:

  • Худшее размытое изображение справа имеет размер файла 1,941,702 байт (1,85 МБайт).Его разрешение составляет 3060x3960 пикселей с использованием 16-разрядного цветового пространства RGB.
  • Лучшее четкое изображение слева имеет размер файла 337,879 байт (330 кБайт).Его разрешение составляет 758x996 пикселей, используется 8-битное цветовое пространство Grey.

Таким образом, нет необходимости изменять размер;добавьте флаг -density.Значение плотности 150 странно - попытка диапазона значений приводит к ухудшению изображения в обоих направлениях!

133 голосов
/ 09 декабря 2012

Лично мне это нравится.

convert -density 300 -trim test.pdf -quality 100 test.jpg

Это немного в два раза больше размера файла, но для меня это выглядит лучше.

-density 300 устанавливает dpi, при котором PDF отображается.

-trim удаляет все краевые пиксели того же цвета, что и угловые пиксели.

-quality 100 устанавливает высокое качество сжатия JPEG.

Такие вещи, как -sharpen, плохо работают с текстом, потому что они отменяют действия вашей системы рендеринга шрифтов, делая их более разборчивыми.

Если вы действительно хотите, чтобы он был взорван, используйте здесь изменить размер и, возможно, большее значение dpi, например, targetDPI * scalingFactor, которое будет отображать PDF с разрешением / размером, который вы намереваетесь.

Описания параметров на imagemagick.org: здесь

16 голосов
/ 23 октября 2015

обычно я извлекаю внедренное изображение с помощью pdfimages в собственном разрешении, а затем использую преобразование ImageMagick в нужный формат:

$ pdfimages -list fileName.pdf
$ pdfimages fileName.pdf fileName   # save in .ppm format
$ convert fileName-000.ppm fileName-000.png

, это генерирует лучший и самый маленький файл результатов.

Примечание: для встроенных изображений JPG с потерями вам пришлось использовать -j:

$ pdfimages -j fileName.pdf fileName   # save in .jpg format

В недавнем poppler вы можете использовать -all, который сохраняет убытки как jpg и без потерь как png

На маленькихна платформе Win вы должны были загрузить недавний (0.37 2015 г.) двоичный файл poppler-util из: http://blog.alivate.com.au/poppler-windows/

16 голосов
/ 31 мая 2015

Я использую pdftoppm в командной строке, чтобы получить исходное изображение, обычно с разрешением 300 точек на дюйм, поэтому pdftoppm -r 300, затем используйте convert для выполнения обрезки и преобразования PNG.

13 голосов
/ 19 апреля 2013

Я обнаружил, что он быстрее и стабильнее при пакетной обработке больших PDF-файлов в PNG и JPG с использованием базовой команды gs (он же Ghostscript), которую использует convert.

Вы можете увидетькоманда в выходных данных convert -verbose и есть еще несколько возможных настроек (YMMV), к которым трудно / невозможно получить прямой доступ через convert.

Однако было бы сложнее выполнить вашу обрезку изаточка с использованием gs, поэтому, как я уже сказал, YMMV!

9 голосов
/ 15 мая 2012

Это также дает хорошие результаты:

exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");
6 голосов
/ 21 сентября 2017

Пользователь Linux здесь: я попробовал утилиту командной строки convert (для PDF в PNG), и я не был доволен результатами. Я нашел, что это проще, с лучшим результатом:

  • Извлеките pdf-страницы с помощью pdftk
    • например: pdftk file.pdf cat 3 output page3.pdf
  • открыть (импортировать) этот pdf с GIMP
    • важно: изменить импорт Resolution с 100 на 300 или 600 pixel/in
  • в GIMP экспорт в формате PNG (изменить расширение файла на .png)

Edit:

Добавлена ​​картинка, как указано в Comments. Используемая команда преобразования:

convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png

GIMP: импортируется с разрешением 300 точек на дюйм (пикс / дюйм); экспортируется как уровень сжатия PNG 3.

Я не использовал GIMP в командной строке (см. Мой комментарий ниже).

pdf2png

enter image description here

3 голосов
/ 24 октября 2013

Еще одно предложение - вы можете использовать GIMP.

Просто загрузите файл PDF в GIMP-> сохранить как .xcf и тогда вы сможете делать с изображением все, что захотите.

1 голос
/ 28 апреля 2019

В ImageMagick вы можете делать «суперсэмплинг». Вы указываете большую плотность, а затем уменьшаете размер до желаемого для конечного размера. Например с вашим изображением:

convert -density 600 test.pdf -background white -flatten -resize 25% test.png


enter image description here

Загрузите изображение для просмотра в полном разрешении для сравнения ..

Я не рекомендую сохранять в JPG, если вы ожидаете дальнейшей обработки.

Если вы хотите, чтобы размер выходного файла был таким же, как у входного, измените размер до величины, обратной отношению вашей плотности к 72. Например, -density 288 и -resize 25%. 288 = 4 * 72 и 25% = 1/4

Чем больше плотность, тем лучше получаемое качество, но обработка займет больше времени.

0 голосов
/ 08 июля 2019

Я использую icepdf движок java pdf с открытым исходным кодом. Проверьте демоверсию office .

package image2pdf;

import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class pdf2image {

   public static void main(String[] args) {

      Document document = new Document();
      try {
         document.setFile("C:\\Users\\Dell\\Desktop\\test.pdf");
      } catch (PDFException ex) {
         System.out.println("Error parsing PDF document " + ex);
      } catch (PDFSecurityException ex) {
         System.out.println("Error encryption not supported " + ex);
      } catch (FileNotFoundException ex) {
         System.out.println("Error file not found " + ex);
      } catch (IOException ex) {
         System.out.println("Error IOException " + ex);
      }

      // save page captures to file.
      float scale = 1.0f;
      float rotation = 0f;

      // Paint each pages content to an image and
      // write the image to file
      for (int i = 0; i < document.getNumberOfPages(); i++) {
         try {
         BufferedImage image = (BufferedImage) document.getPageImage(
             i, GraphicsRenderingHints.PRINT, Page.BOUNDARY_CROPBOX, rotation, scale);

         RenderedImage rendImage = image;
         try {
            System.out.println(" capturing page " + i);
            File file = new File("C:\\Users\\Dell\\Desktop\\test_imageCapture1_" + i + ".png");
            ImageIO.write(rendImage, "png", file);
         } catch (IOException e) {
            e.printStackTrace();
         }
         image.flush();
         }catch(Exception e){
             e.printStackTrace();
         }
      }

      // clean up resources
      document.dispose();
   }
}

Я также пробовал imagemagick и pdftoppm , и pdftoppm, и icepdf имеют большее разрешение, чем imagemagick.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...