Текст с отстъп отдясно в 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 Release >= 0.13.1 (не някоя от старите 1.0.0.rc)

Вижте GitHub: Prawn Issues 578

person Yolgie    schedule 04.03.2014

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

Всичко, което трябваше да направя, беше да премахна тези знаци:

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