ReportLab 'LayoutError' Обработка и отладки -- python поле с участием debugging поле с участием testing поле с участием reportlab пол Связанный проблема

Reportlab 'LayoutError' handling and debugging


6
vote

проблема

русский

Я работал с некоторыми сложными выходами PDF с ReportLab. Это, как правило, хорошо, но есть некоторые случаи, где я получаю LayoutErrors - это обычно потому, что стойки слишком велики в какой-то момент.

Доказывает, что оказывается довольно трудно отладить их, так как у меня нет больше информации, чем что-то вроде этого;

 <код> Flowable <Table@0x104C32290 4 rows x 6 cols> with cell(0,0) containing '<Paragraph at 0x104df2ea8>Authors'(789.0 x 1176) too large on page 5 in frame 'normal'(801.543307087 x 526.582677165*) of template 'Later'   

Это действительно не так полезно. Что я бы в идеале хотел бы знать, - это лучшие стратегии отладки и тестирования для этой вещи.

    .
  • Есть как я могу просмотреть сломанный PDF? I.E. сделано с ошибками макета, чтобы я мог видеть, что происходит легче.
  • Есть, что я могу добавить крючок для ReportLab, чтобы лучше справиться с этими ошибками? Вместо того, чтобы просто не пройти от целого PDF?
  • Любые другие предложения о в целом совершенствования, тестирования и обработки таких проблем.

У меня нет конкретного примера, поэтому его более общий совет, исключение выше, я решил, но его вроде посредством проб и ошибок (чтение; угадать и видеть, что происходит).

Английский оригинал

I have been working with some complex PDF outputs with reportlab. These are generally fine but there are some cases still where I get LayoutErrors - these are usually because Flowables are too big at some point.

It's proving o be pretty hard to debug these as I don't often have more information than something like this;

Flowable <Table@0x104C32290 4 rows x 6 cols> with cell(0,0) containing '<Paragraph at 0x104df2ea8>Authors'(789.0 x 1176) too large on page 5 in frame 'normal'(801.543307087 x 526.582677165*) of template 'Later' 

It's really not that helpful. What I would ideally like to know is the best debugging and testing strategies for this kinda thing.

  • Is there a way I can view a broken PDF? i.e. rendered with the layout errors so I can see whats going on more easily.
  • Is there a way I can add a hook to reportlab to better handle these errors? Rather than just failing the whole PDF?
  • Any other suggestions about generally improving, testing and handling problems like these.

I don't have a particular example so its more general advice, the exception above I have resolved but its kinda through trial and error (read; guessing and seeing what happens).

</div
           

Список ответов

2
 
vote
vote
Лучший ответ
 
<Р> У нас была проблема при использовании ReportLab форматировать некоторый контент, который был первоначально HTML и иногда HTML был слишком сложным. Решение (и я не несу кредит здесь, это было от парней в ReportLab) было поймать ошибку, когда это произошло, и выводить его непосредственно в PDF. <Р> Это означает, что вы получите, чтобы увидеть причину проблемы в правильном контексте. Вы могли бы расширить на этом для вывода деталей, за исключением, но в нашем случае, так как наша задача преобразования HTML в RML мы просто должны были показать наш вход: <Р> Лобовое опрятный шаблон содержит это:
 <код> {{script}} #This section contains python functions used within the rml. #we can import any helper code we need within the template, #to save passing in hundreds of helper functions at the top from rml_helpers import blocks {{endscript}}   
<Р>, а затем позже биты шаблона, как:
 <код>     {{if equip.specification}}  <condPageBreak height="1in"/>          <para style="h2">Item specification</para>         {{blocks(equip.specification)}}     {{endif}}   
<Р> В rml_helpers.py мы имеем:
 <код> from xml.sax.saxutils import escape from rlextra.radxml.html_cleaner import cleanBlocks from rlextra.radxml.xhtml2rml import xhtml2rml  def q(stuff):     """Quoting function which works with unicode strings.      The data from Zope is Unicode objects.  We need to explicitly     convert to UTF8; then escape any ampersands.  So        u"Black & Decker drill"     becomes        "Black &amp; Decker drill"     and any special characters (Euro, curly quote etc) end up     suitable for XML.  For completeness we'll accept 'None'     objects as well and output an empty string.      """     if stuff is None:         return ''     elif isinstance(stuff,unicode):         stuff = escape(stuff.encode('utf8'))     else:         stuff = escape(str(stuff))     return stuff.replace('"','&#34;').replace("'", '&#39;')  def blocks(txt):     try:         txt2 = cleanBlocks(txt)         rml = xhtml2rml(txt2)         return rml     except:         return '<para style="big_warning">Could not process markup</para><para style="normal">%s</para>' % q(txt)   
<Р> Так что ничего, что является слишком сложным для <код> xhtml2rml , чтобы ручка бросает исключение, и заменяется на выходе при большом предупреждение «Не удалось обработать разметки» с последующей разметкой, которая вызвала ошибку, избегали так она выступает как буквальное. <Р> Тогда все, что мы должны сделать, чтобы помнить, чтобы искать выход PDF для сообщения об ошибках и исправить вход соответственно.
 

We had a problem when using Reportlab to format some content that was originally html and sometimes the html was too complex. The solution (and I take no credit here, this was from the guys at Reportlab) was to catch the error when it occurred and output it directly into the PDF.

That means you get to see the cause of the problem in the right context. You could expand on this to output details of the exception, but in our case since our problem was converting html to rml we just had to display our input:

Tthe preppy template contains this:

{{script}} #This section contains python functions used within the rml. #we can import any helper code we need within the template, #to save passing in hundreds of helper functions at the top from rml_helpers import blocks {{endscript}} 

and then later bits of template like:

    {{if equip.specification}}  <condPageBreak height="1in"/>          <para style="h2">Item specification</para>         {{blocks(equip.specification)}}     {{endif}} 

In rml_helpers.py we have:

from xml.sax.saxutils import escape from rlextra.radxml.html_cleaner import cleanBlocks from rlextra.radxml.xhtml2rml import xhtml2rml  def q(stuff):     """Quoting function which works with unicode strings.      The data from Zope is Unicode objects.  We need to explicitly     convert to UTF8; then escape any ampersands.  So        u"Black & Decker drill"     becomes        "Black &amp; Decker drill"     and any special characters (Euro, curly quote etc) end up     suitable for XML.  For completeness we'll accept 'None'     objects as well and output an empty string.      """     if stuff is None:         return ''     elif isinstance(stuff,unicode):         stuff = escape(stuff.encode('utf8'))     else:         stuff = escape(str(stuff))     return stuff.replace('"','&#34;').replace("'", '&#39;')  def blocks(txt):     try:         txt2 = cleanBlocks(txt)         rml = xhtml2rml(txt2)         return rml     except:         return '<para style="big_warning">Could not process markup</para><para style="normal">%s</para>' % q(txt) 

So anything which is too complex for xhtml2rml to handle throws an exception and is replaced in the output by a big warning 'Could not process markup' followed by the markup that caused the error, escaped so it appears as literal.

Then all we have to do is to remember to search the output PDF for the error message and fix up the input accordingly.

</div
 
 
4
 
vote
<Р> Убедитесь, что вы не повторно использовать любой из ваших текучих объектов (как, рендеринг нескольких версий документа с использованием общих частей шаблона). Это не поддерживается ReportLab, и может вызвать эту ошибку. <Р> Причина, кажется, что ReportLab будет установлен атрибут этих объектов при выполнении макета, чтобы указать, что это было необходимо, чтобы переместить их на отдельную страницу. Если он должен быть перемещен в два раза, он будет бросать это исключение. Эти атрибуты не сбрасываются при визуализации документа, поэтому может оказаться, что объект был перемещен в отдельную страницу в два раза, когда он на самом деле не было. <Р> Я взломал вокруг этого перед тем, сбросив атрибут вручную (я не могу вспомнить имя прямо сейчас, это было «_deferred» или что-то), но правильный подход выбросить любые объекты, которые вы использовали для визуализации документ после его визуализации.
 

Make sure you are not re-using any of your flowable objects (as in, rendering multiple versions of a document using common template parts). This is not supported by ReportLab, and can cause this error.

The reason seems to be that ReportLab will set an attribute on these objects when performing the layout to indicate that it was needed to move them to a separate page. If it has to be moved twice, it will throw that exception. These attributes are not reset when you render a document, so it can appear that an object was moved to a separate page twice when it really wasn't.

I've hacked around this before by resetting the attribute manually (I can't remember the name right now; it was '_deferred' or something), but the correct approach is to toss out any objects you used to render a document after it's rendered.

</div
 
 
 
 

Связанный проблема

2  Скапировка не вызывает никакой другой функции после «__init__»  ( Scrapy not calling any other function after init ) 
ОС: Ubuntu 16.04 Стек - Scrapy 1.0.3 + Selenium Я довольно новичок в Scrape, и это может звучать очень простое, но в моем пауке только « init » выполняется. Л...

-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict  ( How to sum values when zipping similar key to build a dict ) 
У меня есть <код> A = [a, b, c, d, a, d, c] и <код> B=[1, 2, 3, 4, 5, 6, 7] Почему <код> dict(zip(A,B)) не возвращается <код> {'a': 6, 'b': 2, 'c': 10, '...

2  Добавьте номера в шестнадцатеричном базе без конвертации баз?  ( Add numbers in hexadecimal base without converting bases ) 
Мне нужно написать функцию, которая получает два числа в шестнадцатеричном базе, и вычисляет сумму обоих из них, мне не разрешено преобразовывать их в десятич...

0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV  ( After appending cells find min and max of five different categories in a csv fi ) 
Привет всем У меня есть вопрос. Я просто сейчас изучаю мин и макс. У меня проблемы в нахождении мин и максимум пяти столбцов для каждой категории Вот, что...

0  Запустите сценарий Python в колбу  ( Run python script into flask ) 
У меня есть настольное приложение для обнаружения лиц, написанных в сценарии Python, используя OpenCV и Numpy. Я хочу поставить эти файлы Python в колбу и зап...

9  От CVX до CVXPY или CVXOPT  ( From cvx to cvxpy or cvxopt ) 
Я пытался пройти какой-код из Matlab в Python. У меня такая же проблема с выпуклой оптимизацией, работающая на MATLAB, но у меня возникли проблемы, передавающ...

0  NameError: Имя «Домашние животные» не определены. Питон  ( Nameerror name pets is not defined python ) 
Это код, который я использую, но каждый раз, когда я пытаюсь запустить его, я получаю эту ошибку в терминале: <код> Traceback (most recent call last): Fil...

1  Выполнить файл SQL, возвращать результаты как Pandas DataFrame  ( Execute sql file return results as pandas dataframe ) 
У меня есть сложный запрос SQL Server, который я хотел бы выполнить из Python и вернуть результаты в виде файла PandaFrame. Моя база данных читается только ...

16  Как преобразовать шестигранную строку в шестнадцатеричный номер?  ( How to convert hex string to hex number ) 
У меня есть целое число в бывшем. 16 И я пытаюсь преобразовать этот номер в шестнадцатеричный номер. Я пытался достичь этого, используя функцию Hex, но всякий...

1  Нахождение корней с Scipy.Optimize.root  ( Finding roots with scipy optimize root ) 
Я пытаюсь найти root y функции, называемой f с помощью python. Вот мой код: <код> def f(y): w,p1,p2,p3,p4,p5,p6,p7 = y[:8] t1 = w - 0.500371726*...

0  Почему этот сценарий Python работает на Ubuntu, но не распачин?  ( Why does this python script work on ubuntu but not raspbian ) 
Друг, и я создал следующий скрипт, использующий BeautifulSoup, чтобы получить HTML страницы работы, а затем добавить работу на массив, затем файл, затем отпра...

2  Векторный способ применить 3-измерительную маску к RGB в Pytorch  ( Vectorized way to apply a 3 dimension mask to rgb in pytorch ) 
У меня есть тензор HXWX3, представляющий изображение RGB, и тензора RGBX3 (Boolean) Tensor в качестве ввода. Предполагается, что для каждого (i, j) в маске те...

1  Как мне позвонить в родительский класс в подклассе?  ( How do i call on a parent class in a subclass ) 
Мне нужно создать вызов несвязанного метода, чтобы установить имя и листья, и я не знаю, как. Любая помощь ценится. Мой код: <код> class Plant(object): ...

51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала  ( Pythons requests missing dependencies for socks support when using socks5 fro ) 
Я пытаюсь взаимодействовать с API из My Python 2.7 Shell, используя пакет, который опирается на запросы Python. Вещь - это удаленный адрес блокируется моей се...

2  Высокое использование ЦП в ткани 1.0.0  ( High cpu usage in fabric 1 0 0 ) 
в ткани 0,9, все работает нормально, но в 1.0.0, следующий скрипт ткани показывает 100% загрузку CPU в <Код> top : <код> from fabric.api import run def tes...

Связанный проблема

2  Скапировка не вызывает никакой другой функции после «__init__» 
-4  Как суммировать значения при заворачивании аналогичного ключа, чтобы построить Dict 
2  Добавьте номера в шестнадцатеричном базе без конвертации баз? 
0  После добавления клеток найдите мин и максимум пяти различных категорий в файле CSV 
0  Запустите сценарий Python в колбу 
9  От CVX до CVXPY или CVXOPT 
0  NameError: Имя «Домашние животные» не определены. Питон 
1  Выполнить файл SQL, возвращать результаты как Pandas DataFrame 
16  Как преобразовать шестигранную строку в шестнадцатеричный номер? 
1  Нахождение корней с Scipy.Optimize.root 
0  Почему этот сценарий Python работает на Ubuntu, но не распачин? 
2  Векторный способ применить 3-измерительную маску к RGB в Pytorch 
1  Как мне позвонить в родительский класс в подклассе? 
51  Запросы Python «Пропасные зависимости от поддержки носков» при использовании SOCKS5 из терминала 
2  Высокое использование ЦП в ткани 1.0.0