2013-09-17 2 views
1

Я использую Matlab для вывода многостраничный файл с PS:Ghostscript ошибка преобразования многостраничный PS в многостраничный PDF с помощью pdfwrite

print(figure, '-dpsc2', fullfile(folder, [file '.ps']), '-r600', '-append') 

, а затем с помощью Matlab для вызова Ghostscript для преобразования полученного PS файл в формате PDF:

system(['"' gsPath '" -sDEVICE=pdfwrite \ 
-dDEVICEWIDTHPOINTS=' num2str(int32(width*72)) ' \ 
-dDEVICEHEIGHTPOINTS=' num2str(int32(height*72)) ' \ 
-dPDFFitPage \ 
-o "' fullfile(folder, [file '.pdf']) '" "' fullfile(folder, [file '.ps']) '"']); 

, который просто очень трудно читаемый способ писать что-то вдоль линий

gswin64c -sDEVICE=pdfwrite^
-dDEVICEWIDTHPOINTS=100^
-dDEVICEHEIGHTPOINTS=100^
-dPDFFitPage^
-o "C:\folder\output.pdf" "C:\folder\input.ps" 

, где я привел в пример значения для размеров устройства и путей ввода-вывода. Когда я использую этот код для печати одной фигуры (одной страницы) в PDF, все работает отлично. Однако при печати нескольких фигур (несколько страниц) PDF, Ghostscript выдает ошибку:

GPL Ghostscript 9.06 (2012-08-08) 
Copyright (C) 2012 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
**** Unable to open the initial device, quitting. 

Теперь, если я удалить -dDEVICEWIDTHPOINTS=100 -dDEVICEHEIGHTPOINTS=100 часть моей команды Ghostscript и снова попытаться напечатать несколько цифр в формате PDF, это работает штраф (за исключением того, что размер страницы отличается от того, что я хочу).

GPL Ghostscript 9.06 (2012-08-08) 
Copyright (C) 2012 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 4032872 2490784 2311720 1014184 2 done. 

Неужели кто-нибудь еще сталкивается с подобной проблемой и нашел обходное решение для этой проблемы? Один из ключей здесь заключается в том, что мне нужно иметь возможность контролировать размер страницы созданного PDF-файла. Благодаря!

+0

Вы, возможно, потребуется дважды ваши обратные слэши. Postscript интерпретирует обратную косую черту как escape. –

+0

Если вы считаете, что обнаружили ошибку, сообщите об этом как на bugs.ghostscript.com – KenS

ответ

0

Ниже приведен пример, который должен работать нормально. Сначала мы создаем многостраничный файл с PS:

fname = 'test'; 
if exist([fname '.ps'], 'file'), delete([fname '.ps']); end 

hfig = figure; 
for i=1:10 
    plot(cumsum(rand(100,1)-0.5)) 
    drawnow 
    print(hfig, '-dpsc2', '-append', [fname '.ps']) 
end 
close(hfig) 

Далее мы преобразовать его в PDF с помощью Ghostscript, и правильно обрезать цифры:

gs_path = 'C:\Program Files\gs\gs9.07\bin\gswin64c.exe'; 
gs_opts = '-dBATCH -dNOPAUSE -q'; 

% ps2pdf 
cmd = sprintf('"%s" %s -sDEVICE=pdfwrite -dPDFFitPage -o %s %s', ... 
    gs_path, gs_opts, [fname '.pdf'], [fname '.ps']); 
disp(cmd); system(cmd); 

% get bbox 
cmd = sprintf('"%s" %s -sDEVICE=bbox %s', ... 
    gs_path, gs_opts, [fname '.pdf']); 
disp(cmd); [~,out] = system(cmd); 
out = textscan(out, '%s', 'Delimiter',''); 
bbox = regexp(out{1}, '^%%BoundingBox: (\d+) (\d+) (\d+) (\d+)','tokens','once'); 
bbox = str2double(vertcat(bbox{:})); 
bbox = [min(bbox(:,1:2)) max(bbox(:,3:4))]; 

% crop to bounding box 
cmd = sprintf(['"%s" %s -o %s -sDEVICE=pdfwrite' ... 
    ' -dDEVICEWIDTHPOINTS=%d -dDEVICEHEIGHTPOINTS=%d -dFIXEDMEDIA' ... 
    ' -c "<</PageOffset [-%d -%d]>> setpagedevice" -f %s'], ... 
    gs_path, gs_opts, [fname '_cropped.pdf'], ... 
    bbox(3)-bbox(1), bbox(4)-bbox(2), bbox(1), bbox(2), [fname '.pdf']); 
disp(cmd); system(cmd); 
+0

Спасибо, это хороший обходной путь. – tarheels

Смежные вопросы