Удалить изображения из PDF - PullRequest
1 голос
/ 24 июня 2011

Я прочитал Создайте tiff только с текстом и без изображений из постскрипт-файла с ghostscript и попытайтесь использовать ответ KenS.Но этот метод удаляет только «черные» изображения - изображение содержит данные только в черном канале (PDF имеет цветовое пространство CMYK).Как я могу удалить все изображения в моем случае?

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Это делает лучшую работу, но она неполная. Это не касается изображений с использованием нескольких источников данных, например. По сути, он не проверен, за исключением того, что я протестировал ваш файл меньшего размера (pages.pdf), используя ps2write для преобразования в PostScript, а затем программу PostScript ниже и устройство pdfwrite для преобразования обратно в PDF.

Первое, что вы заметите, это то, что почти весь текст исчез из вашего документа. Это потому, что используемые вами шрифты являются растровыми шрифтами, и программа не может определить разницу между растровым изображением, представляющим символ, и любым другим видом растрового изображения. Для этого файла вы можете решить эту проблему, удалив определение маски изображения, потому что все символы используют маску изображения, а другие изображения используют изображение.

У меня есть подлое подозрение, что форматирование программы будет здесь запутано: - (

8<------------------------------8<--------------------------8<-------------------------
%!

% 
% numbytes -file- ConsumeFileData -
%
/ConsumeFileData {
  userdict begin
  /DataString 256 string def
  /DataFile exch def
  /BytesToRead exch def

%(BytesToRead = ) print BytesToRead ==
  mark
  {
    DataFile DataString readstring {                    % read bytes
      /BytesToRead BytesToRead 256 sub def              % not EOF subtract 256 from required amount.
%(Read 256 bytes) ==
%(BytesToRead now = ) print BytesToRead ==
    } {
      length 
%(Read ) print dup 256 string cvs print (bytes) ==
      BytesToRead exch sub /BytesToRead exch def % Reached EOF, subtract length read froom required amount
%(BytesToRead now = ) print BytesToRead ==
      exit                                              % and exit loop 
    } ifelse
  } loop

%BytesToRead ==
  BytesToRead 0 gt {
    (Ran out of image data reading from DataSource\n) ==
  } if
  cleartomark
  end
} bind def

% 
% numbytes -proc- ConsumeProcData -
%
/ConsumeProcData {
userdict begin
  /DataProc exch def
  /BytesToRead exch def

  {
    DataProc exec                                     % returns a string
    length BytesToRead exch sub                       % subtract # bytes read
    /BytesToRead exch def
    BytesToRead 0 le {
      exit                                            % exit when read enough
    } if
  } loop
end
} bind def

/image {
 (image) ==
 dup type /dicttype eq { 
  dup /MultipleDataSources known {
    dup /MultipleDataSources get {
      (Can't handle image with multiple sources!) ==
    } if
  } if
  dup /Width get                 % stack = -dict- width
  exch dup /BitsPerComponent get % stack = width -dict- bpc
  exch dup /Decode get           % stack = width bpc -dict- decode
  length 2 div                   % decode = 2 * num components
  exch 4 1 roll                  % stack = -dict- width bpc ncomps
  mul mul                        % stack = -dict- width*bpc*ncomps
  7 add cvi 8 idiv               % stack = -dict- width(bytes) 
  exch dup /Height get           % stack = width -dict- height
  exch /DataSource get           % stack = width height DataSource
  3 1 roll                       % stack = DataSource width height
  mul                            % stack = DataSource widht*height
  exch                           % stack = size DataSource
 } {
  5 -1 roll 
  pop                       % throw away matrix
  mul mul                   % bits/sample*width*height
  7 add cvi 8 idiv          % size in bytes of data floor(bits+7 / 8)
  exch                      % stack = size DataSource
 } ifelse

 dup type /filetype eq { 
  ConsumeFileData
 } {
   dup type /arraytype eq or
   1 index type /packedarraytype eq or {
    ConsumeProcData
   } {
    pop pop                  % Remove DataSource and size
   } ifelse
 } ifelse
} bind def

/imagemask {
(imagemask)==
 dup type /dicttype eq { 
  dup /MultipleDataSources known {
    dup /MultipleDataSources get {
      (Can't handle imagemask with multiple sources!) ==
    } if
  } if
  dup /Width get                 % stack = -dict- width
  7 add cvi 8 idiv             % size in bytes of width floor(bits+7 / 8)
  exch dup /Height get           % stack = width -dict- height
  exch /DataSource get           % stack = width height DataSource
  3 1 roll                       % stack = DataSource width height
  mul                            % stack = DataSource width*height
  exch                           % stack = size DataSource
 } {
  5 -1 roll 
  pop                       % throw away matrix
  mul mul                   % bits/sample*width*height
  7 add cvi 8 idiv          % size in bytes of data floor(bits+7 / 8)
  exch                      % stack = size DataSource
 } ifelse

 dup type /filetype eq { 
  ConsumeFileData
 } {
   dup type /arraytype eq or
   1 index type /packedarraytype eq or {
    ConsumeProcData
   } {
    pop pop                  % Remove DataSource and size
   } ifelse
 } ifelse
} bind def

/colorimage {
(colorimage)==
  dup 1 ne {
    1 index
    {
      (Can't handle colorimage with multiple sources!) ==
    } if
  } {
    exch pop                   % get rid of 'multi'
                   % stack: w h bpc m d ncomp
    3 -1 roll pop              % stack: w h bpc d ncomp
    exch 5 -1 roll             % stack d w h bpc ncomp
    mul mul mul                % stack: d w*h*bpc*ncomp
    7 add cvi 8 idiv exch      % stack: bytes datasource
  } ifelse

 dup type /filetype eq { 
  ConsumeFileData
 } {
   dup type /arraytype eq or
   1 index type /packedarraytype eq or {
    ConsumeProcData
   } {
    pop pop                  % Remove DataSource and size
   } ifelse
 } ifelse
} bind def
1 голос
/ 24 июня 2011

Этот метод должен работать для изображений любого цвета, поскольку оператор изображения используется как для цветных, так и для монохромных изображений. Если ваш файл не использует устаревший оператор 'colorimage' уровня 1.5. Я не могу вспомнить, переопределил ли я этот оператор в примере, если нет, то вы можете переопределить его аналогичным образом.

На самом деле я вижу, что я предложил переопределения для изображения, цвета и маски изображения, поэтому все типы изображений должны быть исключены. Возможно, вы могли бы поделиться примером?

...