Пользование библиотекой Java PDFBox для записи российского PDF

Я сказал бы Джинджа также. Это определенно более сильно , чем Джанго Темплэтинг Энджин, и это одинокое .

, Если это было внешним штепселем к существующему заявлению Джанго, Вы могли бы создать сделанная на заказ команда и использовать templating двигатель в своей среде проектов. Как это;

manage.py generatereports --format=html

, Но я не думаю, что стоит просто использовать Джанго Темплэтинга Энджина вместо Джинджи.

11
задан tshepang 29 September 2014 в 03:29
поделиться

3 ответа

Возможно, нужно написать класс кодировки для русского языка, я полагаю, он должен выглядеть как WinAnsiEncoding .
Я понятия не имею, что туда поместить!

Или, если это не то, что вы уже делаете, возможно, вам следует закодировать исходный файл в UTF-8 и использовать кодировку по умолчанию.
Я видел несколько сообщений, связанных с проблемами извлечения русского текста из существующих файлов PDF (конечно, с использованием PDFBox), но я не знаю, связан ли вывод с ним.
Вы также можете написать в список рассылки PDFBox.

0
ответ дан 3 December 2019 в 11:36
поделиться

Это зависит от требований вашего проекта и общей архитектуры. Lucene, как вы знаете, является библиотекой классов, а не отдельной службой, поэтому, вероятно, вы будете писать код, использующий библиотеку lucene, либо на .NET (C #), либо на Java. Если остальной частью вашего проекта является .NET, возможно, имеет смысл использовать порт Lucene.NET, даже если он отстает от версии Java. С другой стороны, если вам нужна очень общая функциональность Lucene, вы можете использовать SOLR как автономную службу, а затем использовать веб-службы для взаимодействия с Lucene из других ваших компонентов, таких как службы .NET, интерфейсы веб-сайтов. и т.д. Между версиями Lucene.NET и Java нет большой разницы, в основном некоторые улучшения производительности и некоторые исправления / изменения в запросах диапазона, а также дополнительная поддержка полезной нагрузки, но это в основном расширенные функции, которые могут вам не понадобиться. Мы используем Lucene.NET 1.9, и он для нас очень стабилен и очень быстр. У нас более 200 миллионов документов, распределенных примерно по 8 индексам.

Ваша основная проблема (о которой вы, вероятно, уже знали) заключается в том, что кодировка байтов, записываемых в поток контента, отличается от кодировки, используемой для поиска глифов. Теперь я постараюсь быть полезным:

Я взглянул на класс кодирования словаря в PdfBox, и он выглядит довольно неинтуитивно ... Речь идет о словаре PDF. Итак, что вам в основном нужно сделать, так это создать объект словаря Pdf (я думаю, что PdfBox называет это типом COSObject), а затем добавить к нему записи.

Кодировка шрифта определяется в PDF как словарь ( см. страницу 266 вышеприведенной спецификации). Словарь содержит название базовой кодировки, а также необязательный массив различий. Технически, массив различий не должен использоваться со шрифтами истинного типа (хотя я видел, как он использовался в некоторых случаях, но не используйте его).

Затем вы укажете запись для cmap для кодировки. Этот cmap будет кодировкой вашего шрифта.

Я предлагаю взять существующий PDF-файл, который делает то, что вы хотите, а затем получить дамп структуры словаря для шрифта, чтобы вы могли видеть, как он выглядит.

] Это определенно не для слабонервных. Я могу оказать некоторую помощь - если вам нужен дамп словаря, сделайте мне гиперссылку с образцом PDF, и я пропущу его через некоторые из алгоритмов, которые я использую в своей разработке iText (я поддерживаю подпрограмму извлечения текста iText -system).

РЕДАКТИРОВАТЬ - 17.11.09

OK - вот дамп словаря из файла russian.pdf (подкаталоги перечислены с отступом и в том порядке, в котором они появились в содержащем словаре):

(/CropBox=[0, 0, 595, 842], /Parent=Dictionary of type: /Pages, /Type=/Page, /Contents=[209 0 R, 210 0 R, 211 0 R, 214 0 R, 215 0 R, 216 0 R, 222 0 R, 223 0 R], /Resources=Dictionary, /MediaBox=[0, 0, 595, 842], /StructParents=0, /Rotate=0)
    Subdictionary /Parent = (/Type=/Pages, /Count=6, /Kids=[195 0 R, 1 0 R, 3 0 R, 5 0 R, 7 0 R, 9 0 R])
    Subdictionary /Resources = (/ExtGState=Dictionary, /ProcSet=[/PDF, /Text], /ColorSpace=Dictionary, /Font=Dictionary, /Properties=Dictionary)
        Subdictionary /ExtGState = (/GS0=Dictionary of type: /ExtGState)
            Subdictionary /GS0 = (/OPM=1, /op=false, /Type=/ExtGState, /SA=false, /OP=false, /SM=0.02)
        Subdictionary /ColorSpace = (/CS0=[/ICCBased, 228 0 R])
        Subdictionary /Font = (/C2_1=Dictionary of type: /Font, /C2_2=Dictionary of type: /Font, /C2_3=Dictionary of type: /Font, /C2_4=Dictionary of type: /Font, /TT2=Dictionary of type: /Font, /TT1=Dictionary of type: /Font, /TT0=Dictionary of type: /Font, /C2_0=Dictionary of type: /Font, /TT3=Dictionary of type: /Font)
            Subdictionary /C2_1 = (/DescendantFonts=[243 0 R], /BaseFont=/LDMIEC+TimesNewRomanPS-BoldMT, /Type=/Font, /Subtype=/Type0, /Encoding=/Identity-H, /ToUnicode=Stream)
            Subdictionary /C2_2 = (/DescendantFonts=[233 0 R], /BaseFont=/LDMIBO+TimesNewRomanPSMT, /Type=/Font, /Subtype=/Type0, /Encoding=/Identity-H, /ToUnicode=Stream)
            Subdictionary /C2_3 = (/DescendantFonts=[224 0 R], /BaseFont=/LDMIHD+TimesNewRomanPS-ItalicMT, /Type=/Font, /Subtype=/Type0, /Encoding=/Identity-H, /ToUnicode=Stream)
            Subdictionary /C2_4 = (/DescendantFonts=[229 0 R], /BaseFont=/LDMIDA+Tahoma, /Type=/Font, /Subtype=/Type0, /Encoding=/Identity-H, /ToUnicode=Stream)
            Subdictionary /TT2 = (/LastChar=58, /BaseFont=/LDMIFC+TimesNewRomanPS-BoldMT, /Type=/Font, /Subtype=/TrueType, /Encoding=/WinAnsiEncoding, /Widths=[250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333], /FontDescriptor=Dictionary of type: /FontDescriptor, /FirstChar=32)
                Subdictionary /FontDescriptor = (/Type=/FontDescriptor, /StemV=136, /Descent=-216, /FontWeight=700, /FontBBox=[-558, -307, 2000, 1026], /CapHeight=656, /FontFile2=Stream, /FontStretch=/Normal, /Flags=34, /XHeight=0, /FontFamily=Times New Roman, /FontName=/LDMIFC+TimesNewRomanPS-BoldMT, /Ascent=891, /ItalicAngle=0)
            Subdictionary /TT1 = (/LastChar=187, /BaseFont=/LDMICP+TimesNewRomanPSMT, /Type=/Font, /Subtype=/TrueType, /Encoding=/WinAnsiEncoding, /Widths=[250, 0, 0, 0, 0, 833, 778, 0, 333, 333, 0, 0, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 0, 564, 0, 444, 0, 722, 667, 667, 722, 611, 556, 0, 722, 333, 389, 0, 611, 889, 722, 722, 556, 0, 667, 556, 611, 0, 722, 944, 0, 722, 0, 333, 0, 333, 0, 500, 0, 444, 500, 444, 500, 444, 333, 500, 500, 278, 0, 500, 278, 778, 500, 500, 500, 0, 333, 389, 278, 500, 500, 722, 0, 500, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500], /FontDescriptor=Dictionary of type: /FontDescriptor, /FirstChar=32)
                Subdictionary /FontDescriptor = (/Type=/FontDescriptor, /StemV=82, /Descent=-216, /FontWeight=400, /FontBBox=[-568, -307, 2000, 1007], /CapHeight=656, /FontFile2=Stream, /FontStretch=/Normal, /Flags=34, /XHeight=0, /FontFamily=Times New Roman, /FontName=/LDMICP+TimesNewRomanPSMT, /Ascent=891, /ItalicAngle=0)
            Subdictionary /TT0 = (/LastChar=55, /BaseFont=/LDMIBN+TimesNewRomanPS-BoldItalicMT, /Type=/Font, /Subtype=/TrueType, /Encoding=/WinAnsiEncoding, /Widths=[250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 500, 500, 500, 0, 0, 0, 0, 500], /FontDescriptor=Dictionary of type: /FontDescriptor, /FirstChar=32)
                Subdictionary /FontDescriptor = (/Type=/FontDescriptor, /StemV=116.867004, /Descent=-216, /FontWeight=700, /FontBBox=[-547, -307, 1206, 1032], /CapHeight=656, /FontFile2=Stream, /FontStretch=/Normal, /Flags=98, /XHeight=468, /FontFamily=Times New Roman, /FontName=/LDMIBN+TimesNewRomanPS-BoldItalicMT, /Ascent=891, /ItalicAngle=-15)
            Subdictionary /C2_0 = (/DescendantFonts=[238 0 R], /BaseFont=/LDMHPN+TimesNewRomanPS-BoldItalicMT, /Type=/Font, /Subtype=/Type0, /Encoding=/Identity-H, /ToUnicode=Stream)
            Subdictionary /TT3 = (/LastChar=169, /BaseFont=/LDMIEB+Tahoma, /Type=/Font, /Subtype=/TrueType, /Encoding=/WinAnsiEncoding, /Widths=[313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 546, 0, 546, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 929], /FontDescriptor=Dictionary of type: /FontDescriptor, /FirstChar=32)
                Subdictionary /FontDescriptor = (/Type=/FontDescriptor, /StemV=92, /Descent=-206, /FontWeight=400, /FontBBox=[-600, -208, 1338, 1034], /CapHeight=734, /FontFile2=Stream, /FontStretch=/Normal, /Flags=32, /XHeight=546, /FontFamily=Tahoma, /FontName=/LDMIEB+Tahoma, /Ascent=1000, /ItalicAngle=0)
        Subdictionary /Properties = (/MC0=Dictionary of type: /OCMD)
            Subdictionary /MC0 = (/Type=/OCMD, /OCGs=Dictionary of type: /OCG)
                Subdictionary /OCGs = (/Usage=Dictionary, /Type=/OCG, /Name=HeaderFooter)
                    Subdictionary /Usage = (/CreatorInfo=Dictionary, /PageElement=Dictionary)
                        Subdictionary /CreatorInfo = (/Creator=Acrobat PDFMaker 6.0 äëÿ Word)
                        Subdictionary /PageElement = (/SubType=/HF)

здесь много движущихся частей.

0
ответ дан 3 December 2019 в 11:36
поделиться

Попробуйте это:

Phrase leftTitle = new Phrase ("САНКТ-ПЕТЕРБУРГ", FontFactory.getFont ("Tahoma", "Cp1251", true, 25));

Это будет работать как минимум с последней версией (5.0.1) iText

-1
ответ дан 3 December 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: