pdfbeads 1.0.7 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/doc/pdfbeads.ru.html CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  <meta name="Generator" content="Written directly in html">
10
10
 
11
- <meta name="Description" content="Руководство пользователя PDFBEADS версии 1.0">
11
+ <meta name="Description" content="Руководство пользователя pdfbeads версии 1.1">
12
12
 
13
13
  <style type="text/css">
14
14
  body {
@@ -30,22 +30,22 @@
30
30
  h1 {
31
31
  font-size: 36px;
32
32
  font-family: Times New Roman, Times, serif;
33
- text-align: center;
34
- font-style: normal;
33
+ text-align: center;
34
+ font-style: normal;
35
35
  font-weight: bold
36
36
  }
37
37
  h2 {
38
38
  font-size: 20px;
39
39
  font-family: Arial, Helvetica, sans-serif;
40
- text-align: center;
41
- font-style: normal;
40
+ text-align: center;
41
+ font-style: normal;
42
42
  font-weight: bold;
43
43
  }
44
44
  h3 {
45
45
  font-size: 16px;
46
46
  font-family: Arial, Helvetica, sans-serif;
47
- text-align: left;
48
- font-style: italic;
47
+ text-align: left;
48
+ font-style: italic;
49
49
  font-weight: bold;
50
50
  }
51
51
  dt {
@@ -57,9 +57,9 @@
57
57
 
58
58
  <body>
59
59
 
60
- <h1>Руководство пользователя PDFBEADS версии 1.0</h1>
60
+ <h1>Руководство пользователя pdfbeads версии 1.1</h1>
61
61
 
62
- <p>(c) Алексей Крюков, 2010</p>
62
+ <p>(c) Алексей Крюков, 2013</p>
63
63
 
64
64
  <p>Утилита pdfbeads предназначена для создания электронных книг в формате
65
65
  PDF из предварительно обработанных отсканированных страниц. В отличие от
@@ -90,7 +90,8 @@ JPEG2000;</p></li>
90
90
  <li><p>создание PDF-файлов с оглавлением и метаданными;</p></li>
91
91
 
92
92
  <li><p>добавление скрытого текстового слоя из документов в формате hOCR
93
- с корректной обработкой символов кириллицы.</p></li>
93
+ с корректной обработкой символов кириллицы либо перенос текста из другого
94
+ PDF-файла.</p></li>
94
95
 
95
96
  </ul>
96
97
 
@@ -103,23 +104,19 @@ JPEG2000;</p></li>
103
104
  <h2>Требования</h2>
104
105
 
105
106
  <p>Для запуска программы требуется прежде всего интерпретатор языка Ruby
106
- версии 1.8 или 1.9, доступный в дистрибутивах большинства Unix-подобных
107
+ версии 1.8 или выше, доступный в дистрибутивах большинства Unix-подобных
107
108
  систем. Версия для Windows может быть загружена с сайта <a
108
109
  href="http://www.rubyinstaller.org/">RubyInstaller</a>. Для корректной
109
110
  установки pdfbeads необходимо также загрузить пакетный менеджер RubyGems,
110
111
  представляющий собой стандартный интерфейс языка Ruby для работы с
111
112
  расширениями. Кроме того, в дополнение к основному дистрибутиву Ruby
112
- понадобятся расширения RMagick и hpricot (последнее&nbsp;&mdash; для
113
- обработки распознанного текста в формате hOCR).</p>
113
+ понадобятся расширения RMagick, Nokogiri (для обработки распознанного
114
+ текста в формате hOCR) и PDF::Reader (для считывания распознанного
115
+ текста из другого PDF-файла).</p>
114
116
 
115
117
  <p>Если вы хотите создавать PDF-файлы с использованием формата сжатия
116
118
  данных JBIG2, то в системе также должна быть установлена утилита jbig2
117
- из пакета <a href="http://github.com/agl/jbig2enc">jbig2enc</a>. Внимание:
118
- по состоянию на октябрь 2010&nbsp;г., когда пишется этот файл,
119
- настоятельно рекомендуется использовать версию jbig2, самостоятельно
120
- собранную из исходников, доступных в репозитории git, поскольку более
121
- ранние версии не обеспечивают корректного сохранения информации о разрешении
122
- изображений.</p>
119
+ из пакета <a href="http://github.com/agl/jbig2enc">jbig2enc</a>.</p>
123
120
 
124
121
  <h2>Установка</h2>
125
122
 
@@ -132,10 +129,10 @@ gem install pdfbeads
132
129
  </pre>
133
130
 
134
131
  <p>Перед запуском программы необходимо удостовериться, что расширение
135
- RMagick установлено и доступно интерпретатору Ruby. К сожалению, эту
136
- зависимость нельзя отследить автоматически, поскольку в некоторых
132
+ RMagick установлено и доступно интерпретатору Ruby. <strong>К сожалению, эту
133
+ зависимость нельзя отследить автоматически</strong>, поскольку в некоторых
137
134
  дистрибутивах Linux (в частности, Ubuntu) пакет RMagick устанавливается в
138
- обход механизма RubyGems, так что утилите gem о нем ничего не известно.</p>
135
+ обход механизма RubyGems, так что утилите <tt>gem</tt> о нем ничего не известно.</p>
139
136
 
140
137
  <p>Пользователям Ubuntu также следует иметь в виду, что в этом дистрибутиве
141
138
  исполняемые файлы из пакетов gem по умолчанию распаковываются в каталоги
@@ -195,7 +192,7 @@ HTM(L) или HOCR, содержащих распознанный текст в
195
192
  pdfbeads, иногда занимает довольно много времени, эти файлы в дальнейшем
196
193
  не удаляются с диска и могут быть повторно использованы при последующих
197
194
  прогонах в целях экономии времени. Для того, чтобы заставить pdfbeads
198
- заменить такие файлы заново созданными версиями, можно запустить его с опцией
195
+ заменить такие файлы заново созданными версиями, можно запустить его с ключом
199
196
  <tt>-f</tt> или <tt>--force-update</tt>.</p>
200
197
 
201
198
  <p>pdfbeads предназначен для сборки PDF из предварительно обработанных
@@ -239,7 +236,7 @@ pdfbeads [options] [files to process] [&gt; output_file.pdf]
239
236
  специальное назначение.</p>
240
237
 
241
238
  <p>Вместо записи PDF-файла на стандартное устройство вывода можно использовать
242
- опцию <tt>-o</tt> или <tt>--output</tt>, сопроводив ее указанием имени файла.</p>
239
+ ключ <tt>-o</tt> или <tt>--output</tt>, сопроводив ее указанием имени файла.</p>
243
240
 
244
241
  <h2>Обработка бинаризованных изображений</h2>
245
242
 
@@ -276,12 +273,12 @@ ImageMagick, что существенно увеличивает скорост
276
273
  <p>По умолчанию передний план страницы упаковывается с помощью технологии
277
274
  сжатия JBIG2, для чего pdfbeads использует утилиту <a
278
275
  href="http://github.com/agl/jbig2enc">jbig2enc</a> (автор&nbsp;&mdash; Адам
279
- Лэнгли). При этом можно задать опцию <tt>-p</tt> (<tt>--pages-per-dict</tt>),
276
+ Лэнгли). При этом можно задать ключ <tt>-p</tt> (<tt>--pages-per-dict</tt>),
280
277
  чтобы указать желательное количество страниц, использующих общий словарь
281
278
  разделенных символов (по умолчанию&nbsp;&mdash; 15).</p>
282
279
 
283
- <p>Если утилита jbig2enc недоступна, либо при запуске pdfbeads была указана
284
- опция <tt>-m</tt> (<tt>--mask-compression</tt>) с аргументом `G4' (синонимы&nbsp;&mdash;
280
+ <p>Если утилита jbig2enc недоступна, либо при запуске pdfbeads был указан
281
+ ключ <tt>-m</tt> (<tt>--mask-compression</tt>) с аргументом `G4' (синонимы&nbsp;&mdash;
285
282
  `Group4', `CCITTFax'), то вместо JBIG2-сжатия будет использоваться формат
286
283
  CCITT Group 4 fax.</p>
287
284
 
@@ -303,7 +300,7 @@ CCITT Group 4 fax.</p>
303
300
  `JP2' или `JPX'), `JPEG' (с синонимом `JPG'), а также `LOSSLESS'
304
301
  (синонимы&nbsp;&mdash; `DEFLATE', `PNG'). Если используемая сборка библиотеки
305
302
  ImageMagick поддерживает формат JPEG2000, по умолчанию используется именно
306
- он; в противном случае&nbsp;&mdash; JPEG. Если выбрана опция LOSSLESS,
303
+ он; в противном случае&nbsp;&mdash; JPEG. Если выбрано значение LOSSLESS,
307
304
  то pdfbeads будет использовать для сжатия изображений технологию deflate.
308
305
  Следует иметь в виду, что это может привести к значительному возрастанию
309
306
  объема данных по сравнению с форматами JPEG2000 или JPEG.</p></dd>
@@ -314,7 +311,7 @@ ImageMagick поддерживает формат JPEG2000, по умолчан
314
311
 
315
312
  <dt>-g, --grayscale</dt>
316
313
  <dd><p>Заставляет pdfbeads принудительно конвертировать цветные картинки в
317
- оттенки серого. Данная опция может быть полезна в том случае, если исходные
314
+ оттенки серого. Данный ключ может быть полезен в том случае, если исходные
318
315
  сканы были выполнены в цвете, но фактически содержали только черно-белые
319
316
  картинки, причем преобразование в оттенки серого не было выполнено на этапе
320
317
  первичной сканобработки. Такая ситуация часто возникает, в частности, при
@@ -354,7 +351,7 @@ pdfbeads, необходимо подготовить два графическ
354
351
  <tt>*.bg.*</tt>) будет содержать фон, освобожденный от текстовых данных,
355
352
  а на втором (с суффиксом <tt>*.fg.*</tt>) останутся только элементы маски
356
353
  с присущей им текстурой. Данная процедура по смыслу напоминает операцию,
357
- осуществляемую утилитой <tt>djvumake</tt> при указании опции <tt>PPM</tt>,
354
+ осуществляемую утилитой <tt>djvumake</tt> при указании ключа <tt>PPM</tt>,
358
355
  и имеет ту же самую цель: создание трехслойной страницы, где один из
359
356
  полноцветных слоев отвечает за отображение фона, а другой&nbsp;&mdash;
360
357
  за раскраску наложенной на этот фон маски.</p>
@@ -379,9 +376,9 @@ pdfbeads, необходимо подготовить два графическ
379
376
  <a href="http://www.imagemagick.org/discourse-server/viewtopic.php?p=41498#p41498">дискуссии
380
377
  на форуме ImageMagick</a>, где обсуждались возможные способы удаления текста
381
378
  с картинки с последующим заполнением образовавшихся «дырок»
382
- исходя из значений соседних пикселей.
379
+ исходя из значений соседних пикселей.</p>
383
380
 
384
- </p><h2>Дополнительные возможности</h2>
381
+ <h2>Дополнительные возможности</h2>
385
382
 
386
383
  <h3>Добавление метаданных</h3>
387
384
 
@@ -397,7 +394,7 @@ pdfbeads, необходимо подготовить два графическ
397
394
  <tt>Author</tt>, <tt>Subject</tt> и <tt>Keywords</tt>. Строки, начинающиеся
398
395
  с символа `#', считаются комментариями и игнорируются.</p>
399
396
 
400
- <p>Ссылку на созданный файл можно передать pdfbeads с помощью опции
397
+ <p>Ссылку на созданный файл можно передать pdfbeads с помощью ключа
401
398
  <tt>-M</tt> (или <tt>--meta</tt>).</p>
402
399
 
403
400
  <h3>Метки страниц</h3>
@@ -481,11 +478,54 @@ PDF-файлу. Для этого используется параметр <tt>
481
478
  параметр указывает, должен ли данный пункт оглавления отображаться
482
479
  развернутым по умолчанию (символы `+' и `1' означают «да»).</p>
483
480
 
484
- <p>Опцию <tt>--toc</tt> целесообразно использовать в сочетании с опцией
481
+ <p>Ключ <tt>--toc</tt> целесообразно использовать в сочетании с ключом
485
482
  <tt>--labels</tt>. В этом случае в файле оглавления можно использовать
486
483
  те же номера страниц, что и в бумажной книге, не задумываясь о сдвигах
487
484
  нумерации.</p>
488
485
 
486
+ <h3>Добавление текстового слоя</h3>
487
+
488
+ <p>pdfbeads позволяет создавать документы PDF со скрытым текстовым
489
+ слоем. Последний может быть либо получен из файлов в формате
490
+ <a href="http://docs.google.com/View?docid=dfxcv4vc_67g844kf">hOCR</a>
491
+ (расширение языка HTML, позволяющее сохранять в документе информацию
492
+ о положении символов и элементов разметки текста на странице), либо
493
+ импортирован из другого PDF-файла.</p>
494
+
495
+ <p>Для создания файлов в формате hOCR необходимо воспользоваться программой
496
+ оптического распознавания символов, поддерживающей этот формат, например
497
+ <a href="https://launchpad.net/cuneiform-linux/">Cuneiform</a> или
498
+ <a href="http://code.google.com/p/tesseract-ocr/">Tesseract</a>.
499
+ Распознанный текст следует сохранить в той же директории, что и остальные
500
+ файлы, относящиеся к проекту. При этом каждой распознанной странице должен
501
+ соответствовать отдельный файл с тем же базовым именем, что и у исходного
502
+ изображения, при расширении HTM(L) или HOCR. Обработка файлов hOCR
503
+ осуществляется автоматически при условии, что интерпретатору Ruby доступно
504
+ расширение Nokogiri.</p>
505
+
506
+ <p>Иное возможное решение заключается в том, чтобы импортировать текстовый
507
+ слой из другого PDF-файла (естественно, последний должен быть получен путем
508
+ распознавания тех же самых изображений, которые предполагается затем обработать
509
+ с помощью pdfbeads). Имя полученного файла следует передать pdfbeads с помощью
510
+ ключа <tt>-T</tt> (полная форма&nbsp;&mdash; <tt>-text-pdf</tt>). Эта
511
+ возможность особенно важна в тех случаях, когда приходится использовать для
512
+ распознавания текста коммерческое приложение (например,
513
+ <a href="http://www.abbyy.ru/finereader/">ABBYY Finereader</a>), в котором
514
+ не предусмотрена поддержка формата hOCR. <strong>Внимание:</strong> возможно,
515
+ вам придется поэкспериментировать с настройками экспорта PDF в OCR-приложении
516
+ для того, чтобы получить наилучшее соответствие между размещением распознанного
517
+ текста на странице и исходным изображением. В частности, в ABBYY Finereader
518
+ 11-й версии желаемый результат достигается только при сохранении файла в
519
+ режиме «текст под изображением».</p>
520
+
521
+ <h3>Обработка документов с направлением текста справа налево</h3>
522
+
523
+ <p>Ключ <tt>-R</tt> (или <tt>--right-to-left</tt> позволяет сохранить
524
+ в создаваемом файле пометку, указывающую на то, что основной язык
525
+ данного документа предполагает направление чтения справа налево. Данный
526
+ флажок используется Acrobat Reader при выборе порядка следования страниц в
527
+ режиме их попарного отображения.</p>
528
+
489
529
  <h2>Лицензия</h2>
490
530
 
491
531
  <p>Данная программа является свободным программным обеспечением. Вы
@@ -49,7 +49,7 @@ module ImageInspector
49
49
  end
50
50
 
51
51
  # Parse image header and retrieve its basic properties. The code is inspired
52
- # by Sam Stephenson's snippet which demonstrates how to determine a JPEG
52
+ # by Sam Stephenson's snippet which demonstrates how to determine a JPEG
53
53
  # image size ( see http://snippets.dzone.com/posts/show/805) and Paul
54
54
  # Schreiber's code for TIFF (see
55
55
  # http://paulschreiber.com/blog/2010/06/10/tiff-file-dimensions-in-ruby/)
@@ -67,12 +67,12 @@ class ImageInspector::Image
67
67
  # Image format and compression method
68
68
  attr_reader :format, :compression
69
69
  # Return TIFF tags as a hash for TIFF images or JPEG images with EXIF
70
- # data. Otherwise this property is nil.
70
+ # data. Otherwise this property is nil.
71
71
  attr_reader :tags
72
72
 
73
73
  @@gc = (IO.method_defined? :getbyte) ? (:getbyte) : (:getc)
74
74
 
75
- # Set all image attributes to nil and open an image if an optional
75
+ # Set all image attributes to nil and open an image if an optional
76
76
  # argument is specified.
77
77
  def initialize( input=nil )
78
78
  clearData()
@@ -99,7 +99,7 @@ class ImageInspector::Image
99
99
  end
100
100
  end
101
101
 
102
- # Return image data (possibly compressed) for a previously initialized
102
+ # Return image data (possibly compressed) for a previously initialized
103
103
  # image as a sring. For JPEG and JPEG2000 this would be the whole image
104
104
  # as it is stored on the disk, while for TIFF and PNG all headers are
105
105
  # stripped and a raw data stream is returned.
@@ -169,7 +169,7 @@ class ImageInspector::Image
169
169
  sign = io.read( 2 )
170
170
  if sign.eql? "\xFF\xD8".to_binary
171
171
  @format = :JPEG
172
- @compression = :DCTDecode
172
+ @compression = :DCTDecode
173
173
  jpgExamine( io )
174
174
  return
175
175
  end
@@ -191,7 +191,7 @@ class ImageInspector::Image
191
191
  sign << io.read( 4 )
192
192
  if sign.eql? "\x00\x00\x00\x0CjP \x0D\x0A\x87\x0A".to_binary
193
193
  @format = :JPEG2000
194
- @compression = :JPXDecode
194
+ @compression = :JPXDecode
195
195
  j2kParseBox( io )
196
196
  return
197
197
  end
@@ -288,8 +288,8 @@ class ImageInspector::Image
288
288
 
289
289
  # We should not expect to find required image properties (such as width
290
290
  # or height) in EXIF data of a JPEG image.
291
- raise 'malformed TIFF: a required tag is missing' unless @format.eql? :JPEG or (
292
- @tags.has_key? 0x0100 and @tags.has_key? 0x0101 and
291
+ raise 'malformed TIFF: a required tag is missing' unless @format.eql? :JPEG or (
292
+ @tags.has_key? 0x0100 and @tags.has_key? 0x0101 and
293
293
  @tags.has_key? 0x0106 and @tags.has_key? 0x0111 and @tags.has_key? 0x0117 )
294
294
 
295
295
  unless @format.eql? :JPEG
@@ -325,16 +325,19 @@ class ImageInspector::Image
325
325
  end
326
326
  @tags.merge! tiffParseIFD( io,@tags[0x8769][0],intgr ) if @tags.has_key? 0x8769
327
327
 
328
- if @tags.has_key? 0x0103
329
- case @tags[0x0103][0]
330
- when 1
331
- @compression = :NoCompression
332
- when 3, 4
333
- @compression = :CCITTFaxDecode
334
- when 5
335
- @compression = :LZWDecode
336
- when 8, 32946
337
- @compression = :FlateDecode
328
+ # Strangely, got some JPEG's marked as LZW-decoded
329
+ unless @format.eql? :JPEG
330
+ if @tags.has_key? 0x0103
331
+ case @tags[0x0103][0]
332
+ when 1
333
+ @compression = :NoCompression
334
+ when 3, 4
335
+ @compression = :CCITTFaxDecode
336
+ when 5
337
+ @compression = :LZWDecode
338
+ when 8, 32946
339
+ @compression = :FlateDecode
340
+ end
338
341
  end
339
342
  end
340
343
 
@@ -433,7 +436,7 @@ class ImageInspector::Image
433
436
  when 'PLTE'
434
437
  @palette = Array.new()
435
438
  for i in (0...length/3)
436
- r, g, b = io.read( 3 ).unpack( 'ccc' )
439
+ r, g, b = io.read( 3 ).unpack( 'CCC' )
437
440
  @palette << [ r, g, b ]
438
441
  end
439
442
  when 'IDAT'
@@ -444,14 +447,14 @@ class ImageInspector::Image
444
447
  @x_dpi = (x_dpm/100 * 2.54).round
445
448
  @y_dpi = (y_dpm/100 * 2.54).round
446
449
  when 'tRNS'
447
- trans = Hash.new[]
450
+ trans = Hash.new()
448
451
  case @cspace
449
452
  when :Indexed
450
453
  # Indexed colour, RGB. Each byte in this chunk is an alpha for
451
454
  # the palette index in the PLTE ("palette") chunk up until the
452
455
  # last non-opaque entry. Set up an array, stretching over all
453
456
  # palette entries which will be 0 (opaque) or 1 (transparent).
454
- @trans = io.read( size ).unpack( 'C*' )
457
+ @trans = io.read( length ).unpack( 'C*' )
455
458
  when :DeviceGray
456
459
  # Greyscale. Corresponding to entries in the PLTE chunk.
457
460
  # Grey is two bytes, range 0 .. (2 ^ bit-depth) - 1