Перетворення PDF у зображення з високою роздільною здатністю


328

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

Я хочу, щоб програма обрізала зайвий пробіл і повернула досить якісне зображення, яке можна прочитати із написання суперапсису з легкістю.

Це моя найкраща зараз . Як бачите, обрізка працює чудово, мені просто потрібно трохи посилити дозвіл. Це команда, яку я використовую:

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

Я намагався приймати такі свідомі рішення:

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

Будь-які вдячні пропозиції щодо отримання роздільної здатності зображення в остаточному форматі PNG / JPEG були б дуже вдячні!


Я не знаю, ви також можете спробувати посилання ...
karnok

1
Дивіться також: askubuntu.com/a/50180/64957
Дейв Джарвіс

Якщо ви перебуваєте на комп'ютері Mac, перегляньте сторінку чоловіка для sips"системи обробки зображень, яку можна прописати". Це редактор зображень командного рядка, вбудований у macOS, працює над PDF-файлами та багатьма іншими типами зображень.
ghoti

@ghoti ковтки перетворить лише першу сторінку PDF-файлу у зображення.
benwiggy

Відповіді:


386

Видається, що такі дії:

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

Це призводить до появи лівого зображення . Порівняйте це з результатом моєї оригінальної команди ( зображення праворуч ):

  

(Щоб дійсно побачити та оцінити відмінності між ними, клацніть правою кнопкою миші на кожній і виберіть "Відкрити зображення в новій вкладці ..." .)

Пам'ятайте також про наступні факти:

  • Гірше, розмите зображення праворуч має розмір файлу 1,941,770 байт (1,85 Мбайт). Його роздільна здатність - 3060x3960 пікселів, використовуючи 16-бітний RGB кольоровий простір.
  • Краще, чіткіше зображення ліворуч має розмір файлу 337,879 байт (330 кБ). Його роздільна здатність становить 758x996 пікселів, використовуючи 8-бітний пробіл сірого кольору.

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


77
densityПараметр трохи особливого в тому , що в повинен прийти перш , ніж вхідний файл. Оскільки PDF - це векторний формат файлів, який не має (багато) поняття пікселів, він говорить приблизно на зразок "сторінка 8 дюймів на 12 дюймів". Якщо ви хочете отримати піксель, ви використовуєте densityналаштування, щоб сказати, скільки пікселів на дюйм ви хочете отримати у висновку. E. g. зі 150 ви отримаєте 8x150 = 1200 на 12x150 = 1800 пікселів у отриманому зображенні. Ось також працює кількість пікселів на різкість, контрастність, стиснення тощо.
Даніель Шнеллер

8
Це може спричинити чорний фон на Mac OS (див. Stackoverflow.com/questions/10934456/… ). Щоб виправити це, додайте -flatten.
Рольф

2
У мене з'явився чорний фон на Mac OS, коли я намагався перетворити pdf в png, додавши -flatten вирішив це.
olala

4
Оце Так! Щойно використав -densityі -flattenпараметр, щоб зменшити розмір PDF (до іншого pdf). Цей -flattenваріант дійсно дуже допомагає зменшити загальний розмір. У моєму випадку без порушень зору.
parvus

2
-densityПрапор, швидше за все , дасть гірші результати на більш високих значеннях , якщо якість вихідного зображення було нижче , ніж це.
parvus

152

Особисто мені це подобається.

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 наведені тут


Це вдвічі більший розмір, головним чином тому, що щільність вихідної сигналу була подвоєна, а якість стиснення jpg встановлена ​​на макс.
rivimey

Використовуючи, convertяк ми дізнаємося, скільки конвертованих сторінок?
Кіран Редді

А, це точно шлях. Збільшити цю щільність джерела і видалити -sharpen. Якість набагато краща, ніж за замовчуванням і набагато природніше, ніж з -sharpen.
Джошуа Пінтер

19

Я використовую pdftoppmв командному рядку для отримання початкового зображення, як правило, з роздільною здатністю 300dpi, тому pdftoppm -r 300використовую convertдля обрізки та перетворення PNG.


1
не використовуючи Imagemagick, це рішення виглядає найбільше в дусі прозорого перетворення. pdftoppmтакож може виводити JPEG та PNG.
Аарон Брік

19

як правило, я витягую вбудоване зображення з '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

За допомогою недавнього попплера ви можете використовувати -все, що зберігає втрати як jpg та без втрат як png

На мало забезпеченій платформі Win вам довелося завантажити останній (0,37 2015) двійковий файл "poppler-util" з веб-сайту: http://blog.alivate.com.au/poppler-windows/


Лише незначне виправлення: друга команда в першому блоці коду повинна починатися з pdftoppm не зpdfimages
satyanarayan rao

ні, старіші PDF-зображення зберігають витягнуті зображення в ppm, як pdftoppm, а pdftoppm ніколи не мала опцію -list. Поточні PDF-зображення можуть безпосередньо зберігати у форматі PNG та JPG за допомогою -all, як зазначено в примітці
Valerio

13

Я виявив це як більш швидким, так і стабільнішим при пакетній обробці великих PDF-файлів у PNG та JPG для використання основної gs(aka Ghostscript) команди, яка convertвикористовує.

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

Однак було б важче зробити обрізку та заточку, використовуючи gs, так що, як я вже сказав, YMMV!


10

Це також дає хороші результати:

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 dpi (px / in); експортується як рівень стиснення PNG 3.

Я не використовував GIMP в командному рядку (re: мій коментар, нижче).

pdf2png

введіть тут опис зображення


1
Чи можна це автоматизувати, якщо у вас тисячі сторінок?
JBWhitmore

@JBWhitmore: гарне запитання. Звичайно, було б просто скриптувати команду pdftk, оскільки вона вже є в командному рядку. Я здійснив дуже швидкий пошук у Google, і виявив, що в GIMP є пакетний режим (я його ще не пробував, але, схоже, це має бути сценарієм
Вікторія Стюарт

1
@JBWhitmore, приклад сценарію для автоматизації перетворення показаний на це питання / відповідь: unix.stackexchange.com/questions/121293/…
tsherwen

1
@tsherwen, Якщо я прочитав це посилання правильно, то як автоматизувати команду перетворення. Мене не бентежить, як це зробити. Однак ця відповідь говорить про використання GIMP в якості одного з кроків - і ні ця відповідь, ні пов'язані не показують, як це зробити автоматизованим.
JBWhitmore

1
@JBWhitmore. Я помилково думав лише над питанням convert. Я бачив лише частину цієї відповіді, в якій згадували, convertі ваше запитання, читаючи ваш коментар щодо автоматизації. Пізніше дякую за вашу відповідь на цю тему, яку я поєднав із рішенням, з яким я пов’язаний, і вирішив інше питання, яке у мене виникло.
tsherwen

7

Я дійсно не мав гарного успіху з convert[оновлення травня 2020 року: насправді: це майже ніколи не працює для мене], але я мав ВИКЛЮЧНИЙ успіх pdftoppm. Ось кілька прикладів отримання високоякісних зображень з PDF:

  1. [Створює файли розміром ~ 25 Мб на пг] Виводить нестиснений формат .tif у 300 DPI у папку під назвою "images", при цьому файли мають назву pg-1.tif , pg-2.tif , pg-3.tif , тощо:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [Створює файли розміром ~ 1 Мб на пг] Виводиться у форматі .jpg при 300 DPI :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [Створює файли розміром ~ 2 Мб на пг] Виводити у форматі .jpg найвищої якості (найменше стиснення) та все ще при 300 DPI :

    mkdir -p images && pdftoppm -jpeg -jpegopt quality=100 -r 300 mypdf.pdf images/pg
    

Щоб отримати додаткові пояснення, варіанти та приклади, дивіться повну відповідь тут:

/ubuntu/150100/extracting-embedded-images-from-a-pdf/1187844#1187844 .

Пов'язані:

  1. [Як перетворити PDF-файл у PDF, у якому можна шукати w / pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. Зшиті:
    1. Як конвертувати PDF в JPG з командним рядком в Linux?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

6

У ImageMagick ви можете робити «суперсимплінг». Ви вказуєте велику щільність, а потім змінюєте розмір вниз на скільки потрібно для кінцевого розміру виводу Наприклад, із зображенням:

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


введіть тут опис зображення

Завантажте зображення для перегляду в повній роздільній здатності для порівняння ..

Я не рекомендую економити в JPG, якщо ви розраховуєте зробити подальшу обробку.

Якщо ви хочете, щоб вихід був такого ж розміру, як вхідний, то змініть розмір до оберненого відношення вашої щільності до 72. Наприклад,-щільність 288 і -розмір 25%. 288 = 4 * 72 і 25% = 1/4

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


3

Ще однією пропозицією є те, що ви можете використовувати GIMP.

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


9
Причиною цього через командний рядок є те, що у мене було тисячі сторінок, які потребували цього процесу.
JBWhitmore

Крім того, GIMP надає сторінку при завантаженні , тому ви хочете встановити роздільну здатність, коли ви вибираєте сторінки для завантаження. Не має великого значення, для чого ви встановлюєте вихідні параметри, якщо ви почнете із завантаження за замовчуванням 100 DPI.
Кіт Девіс

1

Я використовую 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.


1

Будь ласка, зверніть увагу, перш ніж голосувати, це рішення призначене для Gimp, що використовує графічний інтерфейс, а не для ImageMagick, що використовує командний рядок, але для мене це було чудово, як альтернатива, і саме тому я вважаю за потрібне поділитися тут.

Виконайте ці прості дії, щоб витягти зображення у будь-якому форматі з PDF-документів

  1. Завантажте програму маніпуляції зображення GIMP
  2. Відкрийте програму після встановлення
  3. Відкрийте документ PDF, який ви бажаєте витягти Зображення
  4. Виберіть лише сторінки документа PDF, з яких ви хочете витягти зображення. N / B: Якщо вам потрібні лише зображення обкладинки, виберіть лише першу сторінку.
  5. Натисніть кнопку "Відкрити" після вибору сторінок, з яких потрібно витягти зображення
  6. Натисніть на меню Файл, коли GIMP відкриється, коли сторінки відкриваються
  7. Виберіть " Експорт" як у меню "Файл"
  8. Виберіть потрібний тип файлу за допомогою розширення (скажімо, png) під діалоговим вікном, яке з'явиться.
  9. Клацніть Експорт, щоб експортувати зображення в потрібне місце.
  10. Потім ви можете перевірити провідник файлів на предмет експортованого зображення.

Це все.

Я сподіваюся, що це допомагає


Питання в тому, що ImageMagick використовує командний рядок, а не Gimp, що використовує графічний інтерфейс.
sidney

0

Файл PNG, який ви додали, виглядає дійсно розмитим. У випадку, якщо вам потрібно використовувати додаткову післяобробну обробку для кожного зображення, створеного у вигляді попереднього перегляду PDF, ви знизите продуктивність свого рішення.

2JPEG може конвертувати PDF-файл, який ви додали до приємного різкості JPG, та обрізати порожні поля за один дзвінок:

2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop

Розмитість в оригінальному PNG - це те, що надихнуло це питання в першу чергу, а PNG у прийнятій відповіді є досить чітким.
JBWhitmore

0

Використовуйте цей командний рядок:

convert -geometry 3600x3600 -density 300x300 -quality 100 TEAM\ 4.pdf team4.png

Це має правильно перетворити файл, як ви просили.


0

Наступний сценарій python буде працювати на будь-якому Mac (Snow Leopard і вгору). Його можна використовувати в командному рядку з послідовними файлами PDF в якості аргументів, або ви можете ввести в сценарій операцію Run Shell Script в Automator і зробити сервіс (Швидка дія в 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's developer pages.
                options = {
                    Quartz.kCGImagePropertyDPIHeight: resolution,
                    Quartz.kCGImagePropertyDPIWidth: resolution
                    }
                writeImage (image, url, type, options)
                del page

0

Ви можете це зробити у LibreOffice Draw (який зазвичай попередньо встановлюється в Ubuntu ):

  1. Відкрийте PDF-файл у LibreOffice Draw.
  2. Перейдіть до потрібної сторінки.
  3. Переконайтесь, що елементи тексту / зображення розміщені правильно. Якщо ні, ви можете налаштувати / відредагувати їх на сторінці.
  4. Головне меню: Файл> Експорт ...
  5. Виберіть потрібний формат зображення в нижньому правому меню. Я рекомендую PNG.
  6. Дайте назву своєму файлу та натисніть кнопку Зберегти.
  7. З'явиться вікно параметрів, так що ви можете налаштувати роздільну здатність і розмір
  8. Натисніть кнопку ОК, і ви закінчите.

0

Я використав pdf2image . Проста бібліотека пітонів, яка працює як шарм.

Спочатку встановіть poppler на машині, яка не працює під Linux. Ви можете просто завантажити поштовий індекс. Розпакуйте у файлах програми та додайте бін до машинного шляху.

Після цього ви можете використовувати pdf2image в класі python таким чином:

from pdf2image import convert_from_path, convert_from_bytes
images_from_path = convert_from_path(
   inputfile,
   output_folder=outputpath,
   grayscale=True, fmt='jpeg')

Я не гарний з python, але зміг зробити exe з цього. Пізніше ви можете використовувати exe з параметром введення та виводу файлу. Я використовував це в C # і все працює нормально.

Якість зображення хороша. OCR працює чудово.


-1

Це насправді досить просто зробити з Preview на mac. Все, що вам потрібно зробити, - це відкрити файл у Попередньому перегляді та зберегти як (або експортувати) png чи jpeg, але переконайтесь, що ви використовуєте принаймні 300 dpi в нижній частині вікна, щоб отримати якісне зображення.


6
Чи можна це автоматизувати, якщо у вас тисячі сторінок?
JBWhitmore
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.