Конвертировать PDF в изображение с высоким разрешением
Я пытаюсь использовать программу convert
из командной строки, чтобы convert
PDF в изображение (JPEG или PNG). Вот один из PDF файлов, которые я пытаюсь конвертировать.
Я хочу, чтобы программа убрала лишние пробелы и вернула изображение достаточно высокого качества, чтобы верхние индексы можно было легко прочитать.
Это моя лучшая попытка. Как видите, обрезка работает нормально, мне просто нужно немного повысить разрешение. Это команда, которую я использую:
convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg
Я пытался принять следующие сознательные решения:
- изменить его размер больше (не влияет на разрешение)
- сделать качество как можно выше
- используйте
-sharpen
(я пробовал диапазон значений)
Будем очень благодарны за любые предложения по получению разрешения изображения в финальном PNG/JPEG выше!
Ответы
Ответ 1
Похоже, что следующие работы:
convert \
-verbose \
-density 150 \
-trim \
test.pdf \
-quality 100 \
-flatten \
-sharpen 0x1.0 \
24-18.jpg
В результате получается левое изображение. Сравните это с результатом моей исходной команды ( изображение справа):
![FCjw6.jpg]()
(Чтобы действительно видеть и оценивать различия между ними, щелкните их правой кнопкой мыши и выберите "Открыть изображение в новой вкладке...".)
Также учитывайте следующие факты:
- Хуже, размытое изображение справа имеет размер файла 1.941.702 байт (1.85 МБайт).
Его разрешение составляет 3060x3960 пикселей, используя 16-битное цветовое пространство RGB.
- Лучшее четкое изображение слева имеет размер файла 337,879 байт (330 кбайт).
Его разрешение составляет 758x996 пикселей, используя 8-битное серое цветовое пространство.
Таким образом, нет необходимости изменять размер; добавьте флаг -density
. Значение 150 плотности является странным - попытка использования ряда значений приводит к ухудшению изображения в обоих направлениях!
Ответ 2
Лично мне это нравится.
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 здесь
Ответ 3
Я использую pdftoppm
в командной строке, чтобы получить начальное изображение, обычно с разрешением 300 точек на дюйм, поэтому pdftoppm -r 300
, затем используйте convert
для выполнения обрезки и преобразования PNG.
Ответ 4
обычно я извлекаю внедренное изображение с помощью 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
С недавним попплером вы можете использовать -all, который сохраняет убытки как JPG и без потерь как PNG
На небольшой предоставляемой платформе Win вам пришлось загрузить недавний (0.37 2015 г.) бинарный файл poppler-util с http://blog.alivate.com.au/poppler-windows/
Ответ 5
Я нашел его более быстрым и стабильным при пакетной обработке больших PDF файлов в PNG и JPG, чтобы использовать базовую команду gs
(aka Ghostscript), которая использует convert
.
Вы можете увидеть команду на выходе convert -verbose
, и там есть несколько дополнительных настроек (YMMV), которые трудно или невозможно получить непосредственно через convert
.
Однако было бы сложнее выполнить обрезку и резкость с помощью gs
, поэтому, как я уже сказал, YMMV!
Ответ 6
Он также дает хорошие результаты:
exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");
Ответ 7
Пользователь 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)
Редактировать:
Добавлена картинка, как того требуют Comments
. Используемая команда преобразования:
convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png
GIMP
: импортируется с разрешением 300 точек на дюйм (пикс/дюйм); экспортируется как уровень сжатия PNG 3.
Я не использовал GIMP в командной строке (см. Мой комментарий ниже).
![pdf2png]()
![enter image description here]()
Ответ 8
Еще одно предложение состоит в том, что вы можете использовать GIMP.
Просто загрузите файл PDF в GIMP- > save как .xcf, а затем сделайте все, что захотите.
Ответ 9
В 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
Чем больше плотность, тем лучше полученное качество, но обработка займет больше времени.
Ответ 10
Файл PNG, который вы прикрепляете, выглядит действительно размытым. Если вам нужно использовать дополнительную пост-обработку для каждого изображения, которое вы создали в виде предварительного просмотра PDF, вы уменьшите производительность своего решения.
2JPEG может конвертировать PDF файл, который вы прикрепляете к хорошему резкости JPG, и обрезать пустые поля за один вызов:
2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop
Ответ 11
Используйте эту командную строку:
convert -geometry 3600x3600 -density 300x300 -quality 100 TEAM\ 4.pdf team4.png
Это должно правильно преобразовать файл, как вы просили.
Ответ 12
Это на самом деле довольно легко сделать с Preview на Mac. Все, что вам нужно сделать, это открыть файл в режиме предварительного просмотра и сохранить как (или экспортировать) файл в формате png или jpeg, но убедитесь, что вы используете не менее 300 точек на дюйм в нижней части окна, чтобы получить изображение высокого качества.
Ответ 13
Следующий скрипт на python будет работать на любом Mac (Snow Leopard и выше). Его можно использовать в командной строке с последовательными файлами PDF в качестве аргументов, или вы можете вставить действие Run Shell Script в Automator и создать сервис (Quick Action in Mojave).
Вы можете установить разрешение выходного изображения в скрипте.
Скрипт и Quick Action можно скачать с github.
#!/usr/bin/python
# coding: utf-8
import os, sys
import Quartz as Quartz
from LaunchServices import (kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG, kCFAllocatorDefault)
resolution = 300.0 #dpi
scale = resolution/72.0
cs = Quartz.CGColorSpaceCreateWithName(Quartz.kCGColorSpaceSRGB)
whiteColor = Quartz.CGColorCreate(cs, (1, 1, 1, 1))
# Options: kCGImageAlphaNoneSkipLast (no trans), kCGImageAlphaPremultipliedLast
transparency = Quartz.kCGImageAlphaNoneSkipLast
#Save image to file
def writeImage (image, url, type, options):
destination = Quartz.CGImageDestinationCreateWithURL(url, type, 1, None)
Quartz.CGImageDestinationAddImage(destination, image, options)
Quartz.CGImageDestinationFinalize(destination)
return
def getFilename(filepath):
i=0
newName = filepath
while os.path.exists(newName):
i += 1
newName = filepath + " %02d"%i
return newName
if __name__ == '__main__':
for filename in sys.argv[1:]:
pdf = Quartz.CGPDFDocumentCreateWithProvider(Quartz.CGDataProviderCreateWithFilename(filename))
numPages = Quartz.CGPDFDocumentGetNumberOfPages(pdf)
shortName = os.path.splitext(filename)[0]
prefix = os.path.splitext(os.path.basename(filename))[0]
folderName = getFilename(shortName)
try:
os.mkdir(folderName)
except:
print "Can't create directory '%s'"%(folderName)
sys.exit()
# For each page, create a file
for i in range (1, numPages+1):
page = Quartz.CGPDFDocumentGetPage(pdf, i)
if page:
#Get mediabox
mediaBox = Quartz.CGPDFPageGetBoxRect(page, Quartz.kCGPDFMediaBox)
x = Quartz.CGRectGetWidth(mediaBox)
y = Quartz.CGRectGetHeight(mediaBox)
x *= scale
y *= scale
r = Quartz.CGRectMake(0,0,x, y)
# Create a Bitmap Context, draw a white background and add the PDF
writeContext = Quartz.CGBitmapContextCreate(None, int(x), int(y), 8, 0, cs, transparency)
Quartz.CGContextSaveGState (writeContext)
Quartz.CGContextScaleCTM(writeContext, scale,scale)
Quartz.CGContextSetFillColorWithColor(writeContext, whiteColor)
Quartz.CGContextFillRect(writeContext, r)
Quartz.CGContextDrawPDFPage(writeContext, page)
Quartz.CGContextRestoreGState(writeContext)
# Convert to an "Image"
image = Quartz.CGBitmapContextCreateImage(writeContext)
# Create unique filename per page
outFile = folderName +"/" + prefix + " %03d.png"%i
url = Quartz.CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, outFile, len(outFile), False)
# kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG
type = kUTTypePNG
# See the full range of image properties on Apple developer pages.
options = {
Quartz.kCGImagePropertyDPIHeight: resolution,
Quartz.kCGImagePropertyDPIWidth: resolution
}
writeImage (image, url, type, options)
del page
Ответ 14
Пожалуйста, примите к сведению, прежде чем голосовать, это решение для Gimp, использующего графический интерфейс, а не для ImageMagick, использующего командную строку, но оно отлично работало для меня как альтернативы, и поэтому я счел необходимым поделиться здесь.
Выполните следующие простые действия, чтобы извлечь изображения в любом формате из PDF-документов
- Загрузите программу управления изображениями GIMP
- Откройте программу после установки
- Откройте PDF-документ, который вы хотите извлечь изображения
- Выберите только те страницы документа PDF, из которых вы хотите извлечь изображения.
N/B: если вам нужны только обложки, выберите только первую страницу.
- Нажмите "Открыть" после выбора страниц, из которых вы хотите извлечь изображения из
- Откройте меню Файл, когда GIMP откроет страницы
- .Выберите Экспортировать как в меню "Файл"
- .Выберите нужный тип файла по расширению (скажем, png) под всплывающим диалоговым окном.
- Нажмите Экспорт, чтобы экспортировать изображение в нужное место.
- Затем вы можете проверить файловый менеджер на предмет экспортированного изображения.
Это все.
надеюсь, это поможет
Ответ 15
Я использую icepdf java pdf движок с открытым исходным кодом. Проверьте офисную демонстрацию.
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.