Ghostscript PS в PDF проблема с некоторыми персонажами - PullRequest
0 голосов
/ 03 декабря 2018

Я использую банку 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.

У кого-нибудь есть какие-либо предложения о том, как мне обойти это?Я действительно не хочу заменять эти иностранные символы в конечном выводе, если есть какой-либо способ избежать этого.

...