pdfbeads 1.0.7 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/COPYING +0 -0
- data/ChangeLog +59 -0
- data/README +0 -0
- data/bin/pdfbeads +33 -4
- data/doc/pdfbeads.en.html +548 -0
- data/doc/pdfbeads.ru.html +74 -34
- data/lib/imageinspector.rb +24 -21
- data/lib/pdfbeads/pdfbuilder.rb +308 -87
- data/lib/pdfbeads/pdfdoc.rb +0 -0
- data/lib/pdfbeads/pdffont.rb +0 -0
- data/lib/pdfbeads/pdflabels.rb +0 -0
- data/lib/pdfbeads/pdfpage.rb +45 -32
- data/lib/pdfbeads/pdftoc.rb +7 -3
- data/lib/pdfbeads.rb +18 -7
- metadata +92 -61
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="Руководство пользователя
|
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>Руководство пользователя
|
60
|
+
<h1>Руководство пользователя pdfbeads версии 1.1</h1>
|
61
61
|
|
62
|
-
<p>(c) Алексей Крюков,
|
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
|
-
с корректной обработкой символов
|
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 или
|
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
|
113
|
-
|
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 г., когда пишется этот файл,
|
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] [> output_file.pdf]
|
|
239
236
|
специальное назначение.</p>
|
240
237
|
|
241
238
|
<p>Вместо записи PDF-файла на стандартное устройство вывода можно использовать
|
242
|
-
|
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> (автор — Адам
|
279
|
-
Лэнгли). При этом можно задать
|
276
|
+
Лэнгли). При этом можно задать ключ <tt>-p</tt> (<tt>--pages-per-dict</tt>),
|
280
277
|
чтобы указать желательное количество страниц, использующих общий словарь
|
281
278
|
разделенных символов (по умолчанию — 15).</p>
|
282
279
|
|
283
|
-
<p>Если утилита jbig2enc недоступна, либо при запуске pdfbeads
|
284
|
-
|
280
|
+
<p>Если утилита jbig2enc недоступна, либо при запуске pdfbeads был указан
|
281
|
+
ключ <tt>-m</tt> (<tt>--mask-compression</tt>) с аргументом `G4' (синонимы —
|
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
|
(синонимы — `DEFLATE', `PNG'). Если используемая сборка библиотеки
|
305
302
|
ImageMagick поддерживает формат JPEG2000, по умолчанию используется именно
|
306
|
-
он; в противном случае — JPEG. Если
|
303
|
+
он; в противном случае — 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> при указании
|
354
|
+
осуществляемую утилитой <tt>djvumake</tt> при указании ключа <tt>PPM</tt>,
|
358
355
|
и имеет ту же самую цель: создание трехслойной страницы, где один из
|
359
356
|
полноцветных слоев отвечает за отображение фона, а другой —
|
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
|
-
|
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
|
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> (полная форма — <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>Данная программа является свободным программным обеспечением. Вы
|
data/lib/imageinspector.rb
CHANGED
@@ -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
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
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( '
|
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(
|
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
|