Я использую банку ghost4j для конвертации PostScript в PDF.Преобразование не выполняется, если в содержимом присутствуют определенные символы верхнего ASCII.Как ни странно, не все ASCII верхнего уровня вызывают проблему.Информация об ошибках, поступающая из Ghostscript, не очень полезна для меня.
Пример кода, который вызывает проблему:
private void convertPSToPDF()
{
try
{
File ps = new File( "c:\\temp\\gsinput.ps" );
PSDocument document = new PSDocument();
document.load( ps );
File pdf = new File( "c:\\temp\\gsoutput.pdf" );
FileOutputStream stream = new FileOutputStream( pdf );
try
{
PDFConverter converter = new PDFConverter();
converter.setPDFSettings( PDFConverter.OPTION_PDFSETTINGS_PRINTER );
converter.convert( document, stream );
}
catch ( Exception e )
{
e.printStackTrace();
}
finally
{
stream.close();
}
}
catch ( Exception e )
{
System.out.println( e.getMessage() );
}
}
Вывод log4j следующий:
0 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - Error: /undefined in y0m
1 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - Operand stack:
1 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - (3) 375.4 36.3
1 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - Execution stack:
2 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 2045 1 3 %oparray_pop 2044 1 3 %oparray_pop 2025 1 3 %oparray_pop 1884 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval--
2 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - Dictionary stack:
2 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - --dict:961/1684(ro)(G)-- --dict:0/20(G)-- --dict:282/300(L)--
2 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - Current allocation mode is local
2 [AWT-EventQueue-0] INFO org.ghost4j.Ghostscript - Last OS error: No such file or directory
2 [AWT-EventQueue-0] ERROR org.ghost4j.Ghostscript - GPL Ghostscript 9.26: Unrecoverable error, exit code 1
Это, похоже, подразумевает строку PostScript:
(3)375.4 36.3 y0 bnum
Однако я не вижу в этом ничего плохого, и эта строка работает нормально, если я внесу небольшое изменение в другом месте файла.Я заметил, что проблема возникала только в исходных файлах, в которых был символ «í» или «á» ... но «ú» выглядел нормально.
Исходя из этого, фрагмент PostScriptкоторая, кажется, создает проблему, просто пытается написать несколько строковых литералов:
328.9 -25.8 M /str{ 18.0 F4 [(An S)/uacute(is)/iacute(n Ban)]arrayshow}def
strw w 0.5 mul neg 0 RM str
0.0 -36.8 M 10.0 F4 (Other)show
0 -36.80 T
0 -6.00 T
Если я изменю PostScript, чтобы заменить символ 'í' (/ iacute) на обычный 'i', проблема исчезнет,Этот код будет работать:
328.9 -25.8 M /str{ 18.0 F4 [(An S)/uacute(isin Ban)]arrayshow}def
strw w 0.5 mul neg 0 RM str
0.0 -36.8 M 10.0 F4 (Other)show
0 -36.80 T
0 -6.00 T
После вывода log4j я получаю IOException.Похоже, что это просто плохая обработка ошибок внутри кода, так как на данном этапе мы не должны удалять файл.Вершина стека вызовов:
java.io.IOException: Temporary file C:\Users\Tad\AppData\Local\Temp\ghost4j\452f1844-372a-4300-b570-86ec650fe4b6@17580 cannot be deleted
at org.ghost4j.util.DiskStore.removeFile(DiskStore.java:133)
Нет специальных шрифтов;просто Times Roman.Я использую v9.26 библиотеки Ghostscript.
У кого-нибудь есть какие-либо предложения о том, как мне обойти это?Я действительно не хочу заменять эти иностранные символы в конечном выводе, если есть какой-либо способ избежать этого.