Текст с отступом справа в PDF-файлах, созданных с помощью Prawn

Я использую Prawn для рендеринга PDF-файлов в моем приложении Rails.

Однако по какой-то причине мои номера телефонов всегда имеют отступ справа на 2 (?) пробела.

Может ли кто-нибудь сказать мне, что мне здесь не хватает? Все три значения сохраняются в виде строк в моей базе данных SQLite, и я не знаю никаких пробелов.

Значения электронной почты и URL всегда аккуратно выровнены по правому краю.

  def show_sender_details
    text "#{p.telephone}\n#{p.email}\n#{p.url}", :align => :right 
  end

Кто-нибудь может помочь?


person Tintin81    schedule 03.06.2013    source источник
comment
что он возвращает p.telephone.length ? Соответствует ли он точной длине символа?   -  person Muntasim    schedule 12.06.2013
comment
У меня похожая проблема, и я понял, что это «-», которые создают проблему в моем случае. У вас есть "-" в номере телефона? Вы уже решили проблему?   -  person Yolgie    schedule 04.03.2014


Ответы (4)


Номера телефонов всегда имеют отступ справа, потому что в методе text используется :align => :right, поэтому все строки текста выровнены по правому краю.

Вы можете попробовать использовать метод text_box с выравниванием по левому краю и вручную поместить это поле на страницу, определив отступ его левого верхнего угла от верхнего и правого краев страницы (значения bounds.right и bounds.top). Что-то вроде этого (полный рабочий пример):

require 'prawn'
require 'ostruct'

p = OpenStruct.new(
  :telephone => "+1-201-555-2233",
  :email => "[email protected]",
  :url => "http://example.com")

Prawn::Document.generate('simple_text.pdf', :skip_page_creation => true) do
  start_new_page
  text_box("#{p.telephone}\n#{p.email}\n#{p.url}",
    :at => [bounds.right - 100, bounds.top - 100],
    :align => :left,
    :height => 50,
    :width => margin_box.width)
end
person Yevgeniy Anfilofyev    schedule 11.06.2013
comment
Хорошо, большое спасибо. Сейчас я занят другим проектом, но вернусь к этому через несколько дней, чтобы посмотреть, сработает ли ваше предложение. - person Tintin81; 18.06.2013
comment
Хорошо, но мне определенно нужно выровнять мой текст по правому краю. Просто на фирменных бланках выглядит лучше. - person Tintin81; 26.06.2013

Действительно кажется наиболее вероятным, что в поле p.telephone есть какие-то случайные пробелы. Я делаю что-то похожее на вас с Prawn/Rails, поэтому я просто перепробовал столько способов, сколько мог придумать, чтобы заставить его не правильно выравниваться по правому краю, и вставка пробела в поле была единственным способом воспроизвести вашу проблему .

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

text "#{p.telephone.strip}\n#{p.email.strip}\n#{p.url.strip}", :align => :right

или вы можете сделать это в своей модели, если хотите:

def telephone=(t)
  write_attribute(:telephone, t.strip)
end

Лично мне нравится первый вариант (сделать это в коде просмотра PDF), потому что я бы предпочел хранить именно то, что вводит пользователь, и манипулировать его данными только при необходимости (при просмотре), но это имеет тенденцию загромождать посмотреть код немного.

person drosboro    schedule 16.06.2013
comment
Спасибо. Я вернусь к этому через несколько дней. - person Tintin81; 18.06.2013
comment
Метод strip здесь не работает. Ничего не меняет к сожалению. Только что попробовал... - person Tintin81; 26.06.2013

Хорошо, если ваша проблема также связана с дефисами, решение состоит в том, чтобы использовать выпуск Prawn >= 0.13.1 (не какой-либо из старых 1.0.0.rc)

См. GitHub: проблема с креветками 578.

person Yolgie    schedule 04.03.2014

ОК, 4 года спустя я наконец-то могу ответить на свой вопрос (yay!): оказалось, что в моей базе данных было несколько невидимых \r символов. Не уверен, как они туда попали... (Кстати: тем временем я переместил свое приложение с SQLite на MySQL.)

Все, что мне нужно было сделать, это удалить эти символы:

telephone.tr("\r", "")
person Tintin81    schedule 18.02.2017