Как я могу сказать разрешение просканированного PDF из сценария оболочки?

Вы должны окружить ваше предложение ON параметрами, если вы делаете что-то, кроме простого сравнения:

select 
cdbl(fs.[Market Value]) as Value
from [database$] as data 
left join [AFS$] as fs on (data.[FIELD1]=fs.[field1] OR data.[FIELD2]=fs.[field2])

Обратите внимание, что если вы хотите проверить, существуют ли определенные данные, я рекомендую используя предложение EXISTS.

10
задан Norman Ramsey 23 February 2009 в 07:46
поделиться

6 ответов

Я предполагаю, что сканирования включены как изображения в PDF, таким образом, Вы могли использовать pdfimages извлечь их сначала. Затем identify должен смочь найти корректные данные.

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

Вот элементы к этому ответу:

  • pdfimages извлечет изображения так, чтобы количество точек могло быть обнаружено.
  • identify даст размер изображения в единицах точек PostScript (72 к дюйму)
  • Поскольку некоторые сканеры могут разделить единственную страницу на повторные изображения переменных размеров и форм, ключ должен сложить области всех изображений. Деление квадратных точек квадратными дюймами и пущение квадратного корня производят ответ.

Ниже сценарий Lua, который решает проблему. Я, вероятно, возможно, использовал простую оболочку, но получение ширины и высоты будет большей неприятностью.

#!/usr/bin/env lua

require 'osutil'
require 'posixutil'
require 'mathutil'

local function runf(...) return os.execute(string.format(...)) end

assert(arg[1], "no file on command line")

local function dimens(filename)
  local cmd = [[identify -format "return %w, %h\n" $file | sed 1q]]
  cmd = cmd:gsub('$file', os.quote(filename))
  local w, h = assert(loadstring(os.capture(cmd)))()
  assert(w and h)
  return w, h
end

assert(#arg == 1, "dpi of just one file")

for _, pdf in ipairs(arg) do
  local w, h = dimens(pdf)  -- units are points
  local insquared = w * h / (72.00 * 72.00)
  local imagedir = os.capture 'mktemp -d'
  assert(posix.isdir(imagedir))
  runf('pdfimages -f 1 -l 1 %s %s 1>&2', os.quote(pdf),
                                         os.quote(imagedir .. '/img'))
  local dotsquared = 0
  for file in posix.glob(imagedir .. '/img*') do
    local w, h = dimens(file)  -- units are pixels
    dotsquared = dotsquared + w * h
  end
  os.execute('rm -rf ' .. os.quote(imagedir))
  local dpi = math.sqrt(dotsquared / insquared)

  if true then
    io.stderr:write(insquared, " square inches\n")
    io.stderr:write(dotsquared, " square dots\n")
    io.stderr:write(dpi, " exact dpi\n")
    io.stderr:write(math.round(dpi, 10), " rounded dpi\n")
  end
  print(math.round(dpi, 10))
end
4
ответ дан 3 December 2019 в 19:36
поделиться

Если PDF был создан путем сканирования затем должно только быть одно изображение, связанное с каждой страницей. Можно найти каждое разрешение изображения для каждого изображения страницы путем парсинга PDF с помощью iText (Java) или iTextSharp (порт .NET) библиотеки легко.

Если Вы хотите к утилите самокрутки сделать это, сделайте что-то как следующее в iTextSharp:

PdfReader reader = new PdfReader(filename);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
PdfDictionary pg = reader.GetPageN(i);
PdfDictionary res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES));
PdfDictionary xobjs = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT));
if (xobjs != null) 
{
    foreach (PdfName xObjectKey in xobjs.Keys)
    {
    PdfObject xobj = xobjs.Get(xObjectKey);
    PdfDictionary tg = (PdfDictionary)PdfReader.GetPdfObject(xobj);
    PdfName subtype = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE));
    if  (subtype.Equals(PdfName.IMAGE))
    {
        PdfNumber width = (PdfNumber)tg.Get(PdfName.WIDTH);
        PdfNumber height = (PdfNumber)tg.Get(PdfName.HEIGHT);
        MessageBox.Show("image on page [" + i + "] resolution=[" + width +"x" + height + "]");
    }
    }
}
}   
reader.Close();

Здесь для каждой страницы мы прочитываем каждый XObject Изображения подтипа и получаем значения ШИРИНЫ и ВЫСОТЫ. Это будет пиксельным разрешением изображения, которое сканер встроил в PDF.

Обратите внимание, что масштабирование этого изображения для соответствия разрешению страницы (как в размере страницы, представленной в Acrobat - A4, Буква, и т.д.), выполняется отдельно в потоке содержания страницы, который представлен как подмножество постскриптума, и намного тяжелее найти, не анализируя постскриптум.

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

Надежда, которой это помогает в некотором роде, если Вы имеете к утилите самокрутки.

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

Слишком долго для помещения в комментарий но ни ImageMagick, ни GraphicsMagic не до задания; каждый ответ является неправильным:

: nr@yorkie 1932 ; gm identify -format "x=%x y=%y w=%w h=%h" drh*rec*pdf
x=0 y=0 w=612 h=792
x=0 y=0 w=612 h=792
x=0 y=0 w=612 h=792
x=0 y=0 w=612 h=792
x=0 y=0 w=612 h=792
x=0 y=0 w=612 h=792
x=0 y=0 w=612 h=792
x=0 y=0 w=612 h=792

: nr@yorkie 1933 ; identify -format "x=%x y=%y w=%w h=%h" drh*rec*pdf   
x=72 Undefined y=72 Undefined w=612 h=792x=72 Undefined y=72 Undefined     w=612 h=792x=72 Undefined y=72 Undefined w=612 h=792x=72 Undefined     y=72 Undefined w=612 h=792x=72 Undefined y=72 Undefined w=612     h=792x=72 Undefined y=72 Undefined w=612 h=792x=72 Undefined y=72     Undefined w=612 h=792x=72 Undefined y=72 Undefined w=612 h=792
: nr@yorkie 1934 ; 

Корректные параметры для этого документа - то, что каждая отсканированная страница 5 100 пикселей шириной и 6 600 пикселей высотой, не удивляющий для этого был 8.5 на 11, просканированный на уровне 600 точек на дюйм. Вывод от ImageMagic является удивительно непрофессиональным.

Никакой downvotes, потому что Вы пытались быть услужливыми, но *Magick не работать.

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

PDF является разрешением независимый формат, это - бессмысленный вопрос. Вы, возможно, просканировали некоторые битовые массивы в особом разрешении, и те битовые массивы индивидуально встраиваются в PDF, но сам PDF может содержать изображения в нескольких разрешениях, а также разрешении независимая векторная графика. Нет никакого способа знать, не взламывая PDF и исследуя каждый объект в нем.

Редактирование, чтобы продолжить рассуждать о проблеме:

Вы, возможно, стали удачливыми, и программное обеспечение, Вы раньше сканировали документы, встроенные некоторые метаданные об этом, но не держите пари на них. Такие метаданные вряд ли будут стандартными. До парсинга PDF Вы хотели бы предзаписанную библиотеку - такую как ghostscript. Проблема состоит в том, что PDF не является действительно форматом так, поскольку это - указанное подмножество языка программирования PostScript и согласованное способ сжимать/компилировать это подмножество наряду с некоторыми двоичными файлами. Таким образом чтение PDF более сложно, чем другие типы форматов изображения, поскольку оно включает запись интерпретатора языка - не таким образом простой.

Лучший подход должен или вскинуть Ваши руки и сдаться, или действительно посмотреть трудно ghostscript и видеть, можно ли заставить это говорить Вам ответ.

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

PDF Spy от Apago сообщит вам точное разрешение изображений в PDF, а также многое другое. Это коммерческий продукт, но есть 10-дневная демонстрация.

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

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