2

Matlab を使用して複数ページの PS ファイルを出力しています。

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"

ここでは、デバイスのサイズと入出力パスの値の例を示しています。このコードを使用して 1 つの図 (1 ページ) を 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.

ここで、Ghostscript コマンドの一部を削除して、-dDEVICEWIDTHPOINTS=100 -dDEVICEHEIGHTPOINTS=100複数の図を 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.

他の誰かが同様の問題に遭遇し、この問題の回避策を見つけましたか? ここで重要なことの 1 つは、生成される PDF のページ サイズを制御できる必要があるということです。ありがとう!

4

1 に答える 1

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)

次に、Ghostscript を使用して PDF に変換し、図を適切にトリミングします。

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);
于 2013-09-18T22:06:13.170 に答える