我正在使用纯Python解决方案(用于GAE)将网页转换为pdf.
我看了一下reportlab,但文档侧重于从头开始生成pdf,而不是从HTML转换.
您有什么推荐的吗?- 比萨?
编辑:我的用例是我有一个HTML报告,我想在PDF中提供.我将对此报告结构进行更新,因此我不想维护单独的PDF版本,但(希望)会自动转换.
另外,因为我生成报告HTML,我可以确保它是格式良好的XHTML,以使PDF转换更容易.
我安装了reportlab,via
pip install reportlab
Run Code Online (Sandbox Code Playgroud)
(也尝试通过
easy_install reportlab
Run Code Online (Sandbox Code Playgroud)
)
..但是我得到了上面的错误.之前还有其他RL导入 - 它是它所反对的.lib.我曾经让RL工作得很好,但是IT重新构建了我的计算机,我正在尝试重建它.脚本工作正常,但我认为RL安装有点时髦.
Reportlab:3.3.0
为一个条目设置背景颜色并将其设置回默认颜色的最佳方法是什么?
我的脚本现在正在运行,但我确信这不是最好的方法.
我还有两个问题:
self.entry_default_background_color_str
CSS文本的方式.import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
class Window(Gtk.Window):
def __init__(self):
self.screen = Gdk.Screen.get_default()
self.gtk_provider = Gtk.CssProvider()
self.gtk_context = Gtk.StyleContext()
self.gtk_context.add_provider_for_screen(self.screen, self.gtk_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
Gtk.Window.__init__(self, title="Check Input")
self.set_size_request(300, 80)
self.mainbox = Gtk.VBox()
self.add(self.mainbox)
# entry
self.name_entry = Gtk.Entry()
self.name_entry.set_name("name_entry")
self.mainbox.pack_start(self.name_entry, True, True, 0)
self.name_entry.connect("changed", self.check_input)
entry_context = self.name_entry.get_style_context()
self.entry_default_background_color = entry_context.get_background_color(Gtk.StateType.NORMAL)
self.entry_default_background_color_str = self.entry_default_background_color.to_string()
self.show_all()
def check_input(self, _widget=None):
if "red" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background: red; }')
elif "green" …
Run Code Online (Sandbox Code Playgroud) 我必须使用reportlab.pdfbase.pdfmetrics 中的registerFontFamily 方法。我尝试向系列中添加两种字体,但无法将粗体字体与“< b>sometext </b>”一起使用。我的报告需要此功能。我只能用普通的,不知道为什么。
这是代码。
registerFont(TTFont('Own_Font', os.path.dirname(os.path.abspath(__file__)) + '\\OwnSans-Regular.ttf'))
registerFont(TTFont('OwnBold_Font', os.path.dirname(os.path.abspath(__file__)) + '\\OwnSans-Bold.ttf'))
registerFontFamily('Own_Font',normal='Own_Font',bold='OwnBold_Font')
# define parameter for the page and paragraph font
PAGE_WIDTH, PAGE_HEIGHT = landscape(A4)
STYLES = getSampleStyleSheet()
STYLES.add( ParagraphStyle(name='Text', fontName = 'Own_Font', fontSize = 10 ))
STYLES.add( ParagraphStyle(name='Centered', fontName = 'Own_Font', fontSize = 10, alignment=TA_CENTER ))
STYLES.add( ParagraphStyle(name='CenteredBig', parent=STYLES['Centered'], fontSize=18, spaceAfter=10) )
STYLES.add( ParagraphStyle(name='CenteredMedium', parent=STYLES['Centered'], fontSize=15, spaceAfter=10) )
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
File "X:\tools\Python2\lib\site-packages\reportlab-2.7-py2.7-win32.egg\reportlab\platypus\paragraph.py", line 916, in __init__
self._setup(text, style, bulletText or getattr(style,'bulletText',None), frags, cleanBlockQuotedText)
File "X:\tools\Python2\lib\site-packages\reportlab-2.7-py2.7-win32.egg\reportlab\platypus\paragraph.py", line 938, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个段落样式来报告实验室,我在这里定义了一个样式:
def stylesheet():
styles= {
'default': ParagraphStyle(
'default',
fontName='Arial',
fontSize=16,
leading=12,
leftIndent=0,
rightIndent=0,
firstLineIndent=0,
alignment=TA_LEFT,
spaceBefore=0,
spaceAfter=0,
bulletFontName='Arial',
bulletFontSize=10,
bulletIndent=0,
textColor= black,
backColor=None,
wordWrap=None,
borderWidth= 0,
borderPadding= 0,
borderColor= None,
borderRadius= None,
allowWidows= 1,
allowOrphans= 0,
textTransform=None, # 'uppercase' | 'lowercase' | None
endDots=None,
splitLongWords=1,
),
}
Run Code Online (Sandbox Code Playgroud)
然后我就这样打印
pdf = PDFDocument(carte)
pdf.init_report()
pdf.p(str(row))
pdf.generate()
Run Code Online (Sandbox Code Playgroud)
这给出了一个未格式化的输出
当我尝试
pdf = PDFDocument(carte)
pdf.init_report()
pdf.p(str(row), default)
pdf.generate()
Run Code Online (Sandbox Code Playgroud)
要将默认样式应用于我的文本,它会给我 'NameError: name 'styles' is not defined'
有什么线索吗?
对于一个项目,我应该增强一些XML并将其存储在一个文件中.我遇到的问题是我不断收到以下错误:
Traceback (most recent call last):
File "C:\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\Python27\lib\multiprocessing\process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\Bart\Dropbox\Studie\2013-2014\BSc-KI\cite_parser\parser.py", line 193, in parse_references
outputXML = ET.tostring(root, encoding='utf8', method='xml')
File "C:\Python27\lib\xml\etree\ElementTree.py", line 1126, in tostring
ElementTree(element).write(file, encoding, method=method)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 820, in write
serialize(write, self._root, encoding, qnames, namespaces)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 939, in _serialize_xml
_serialize_xml(write, e, encoding, qnames, None)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 939, in _serialize_xml
_serialize_xml(write, e, encoding, qnames, None)
File "C:\Python27\lib\xml\etree\ElementTree.py", line 939, in _serialize_xml …
Run Code Online (Sandbox Code Playgroud) 我尝试使用Python中的reportlab生成一个发货清单.我试图通过使用Platypus将所有部件(如发件人地址,收件人地址,表格)放在适当的位置Frames
.
我遇到的第一个问题是我需要很多Frames
东西以正确的方式定位所有东西,使用Platypus有更好的方法吗?因为我希望发件人地址和我的地址处于相同的高度,如果我只是将它们添加到我的地址,story = []
它们会一个接一个地对齐.
接下来的问题是我正在绘制的表格是动态的,当我到达Frame
(我希望表格去的空间)的末尾时,它只是FrameBreak
在下一帧中进行并且连续.那么如何让Frame
(我的桌子的空间)动态?
我在互联网上遇到的所有示例都是从 url(本地或网络中)加载图像。我想要的是将图像从原始字节直接绘制到 pdf 中。
更新:
@georgexsh 这是我的代码,基于我对以下评论的理解:
def PDF_view(request):
response = HttpResponse(content_type='application/pdf')
...
page = canvas.Canvas(response, pagesize=A4)
page.setTitle("Sample PDF")
image = StringIO(raw_image_bytes) # raw_image_bytes is from external source
image.seek(0)
page.drawImage(image, 100, 100 )
filename = 'document.pdf'
page.showPage()
page.save()
return response
Run Code Online (Sandbox Code Playgroud) 我正在使用reportlab创建一个表格,我想在下表中对齐单个单元格(向右):
我想将包含“职业”的单元格向右对齐
这是我的代码:
studentProfileData = [
['Application Form No', ''],
['Name', userData['studentDetails']["firstName"] + " " +userData['studentDetails']["lastName"]],
['Course opted for', userData['courseDetails']["courseOptedFor"]],
['Specific Course Name', courseMapping["Name"]],
['Category', userData['studentDetails']['caste']],
['Religion', userData['studentDetails']['religion']],
['Fathers'+ "'" +'s Name', userData['studentDetails']['religion']],
['Occupation', userData['studentDetails']['fOccupation']],
['Phone No', ""],
['Term', ""]
]
colwidths = [3 * inch, 1.5 * inch, inch]
# Two rows with variable height
rowheights = [.5*inch] * len(studentProfileData)
studentProfile = Table(studentProfileData, colwidths, rowheights, hAlign='LEFT')
studentProfile.setStyle(TableStyle([
('ALIGN', (0, 0), (0, -1), "LEFT"),
('FONTSIZE', (0,0), (-1, -1), 13), …
Run Code Online (Sandbox Code Playgroud) python ×9
reportlab ×5
pdf ×4
django ×2
css ×1
elementtree ×1
fonts ×1
gtk3 ×1
installation ×1
pip ×1
python-2.7 ×1
python-3.x ×1
unicode ×1