我正在尝试将pygments生成为python代码文件的格式化文本。 我正在尝试在reportlab网站上可用的示例代码。我希望使用它来生成带有适当突出显示代码的pdf文件。
代码文件是:
PdfGenerator.py
from fpdf import FPDF
import re
import os
exampleNameFontSize = 16
fileNameFontSize = 10
codeFontSize = 9
descriptionFontSize = 10
exampleNameFontName = 'Arial'
fileNameFontName = 'Arial'
codeFontName = 'Courier'
descriptionFontName = 'Arial'
exampleNameFontStyle = 'B'
fileNameFontStyle = 'B'
codeFontStyle = ''
descriptionFontStyle = ''
exampleNameCellHeight = 11
fileNameCellHeight = 9
codeCellHeight = 5
descriptionCellHeight = 5
def writeExampleName(pdf, exampleName):
# pdf.set_margins(left=0, top=0)
pdf.set_font(exampleNameFontName, exampleNameFontStyle, exampleNameFontSize)
pdf.cell(0, exampleNameCellHeight, exampleName, 0, 2, "L")
def writeFileName(pdf, fileName):
pdf.set_font(fileNameFontName, fileNameFontStyle, fileNameFontSize)
pdf.cell(0, fileNameCellHeight, fileName, 0, 2, "L")
def writeCode(pdf, code):
pdf.set_font(codeFontName, codeFontStyle, codeFontSize)
pdf.multi_cell(0, codeCellHeight, code, 0, 2, "L")
def writeDescrition(pdf, description):
pdf.set_font(descriptionFontName, descriptionFontStyle, descriptionFontSize)
pdf.multi_cell(0, descriptionCellHeight, description, 0, 2, "L")
pdf = FPDF()
pdf.add_page()
# pdf.set_font('Arial', 'B', 16)
# pdf.cell(40, 10, 'Hello World!')
# pdf.set_font('Arial', 'B', 26)
# pdf.cell(60, 0, 'Powered by FPDF.', 0, 2, 'C')
# writeExampleName(pdf, "Example Name 1")
# writeFileName(pdf, "FileName.txt")
# writeCode(pdf, "#include<stdio.h>\n#include<conio.h>")
#populate key value of summary
info = {}
with open('list.txt') as fh:
matchTuple = re.findall(r'(?ms)^(\d+)\.\s*(.*?(?=^\d+\.|\Z))', fh.read())
for i in matchTuple:
descr = i[1]
p = re.compile('\n(\s*)',re.VERBOSE) # @UndefinedVariable
# descr1 = p.sub(r'\n', descr)
# print('i:',i)
# print('descr: ', descr)
# print('descr1: ', descr1)
if info.get(i[0]) is None:
info[i[0]] = {}
info[i[0]]['description'] = descr
print('info:', info)
# print(matchTuple[0])
# print(type(matchTuple[0]))
# print(matchTuple[0][0])
# print(matchTuple.group(0))
# print(matchTuple.group(1))
# print(matchTuple.group(2))
# print(matchTuple.group(3))
#l = re.findall(r'(?ms)^\d+\.\s*(.*?)(?=^\d+\.|\Z)', fh.read())
#for i in l:
# print(i)
root = "D:/Mahesh/repos/SpringExamples/src/main/java"
xmlroot = "D:/Mahesh/repos/SpringExamples/src/main/resources"
# get full path to all files recursively
fileNames = []
for path, subdirs, files in os.walk(root):
for name in files:
fileNames.append(os.path.join(path, name))
# get max eg count
egCount = set()
for i in fileNames:
matchTuple = re.search(r"eg(\d*)", i, flags=0)
egCount.add((int)(matchTuple.group(1)))
if info.get(matchTuple.group(1)) is not None:
# if info.get(matchTuple.group(1)).get('path') is None:
rindex = i.rindex("\\")-1
info.get(matchTuple.group(1))['path'] = i[0:rindex+1]
else:
print('Example ', i, 'is not there in description list')
# list1 = list(range(1,egCount))
# print(list1)
for i in egCount: # list(range(1,egCount)):
for path, subdirs, files in os.walk(info[str(i)]['path']):
writeExampleName(pdf, "Example " + str(i))
writeDescrition(pdf, info[str(i)]['description'])
writeFileName(pdf,"eg"+str(i)+".xml")
if(os.path.exists(xmlroot + "\\eg" + str(i) + ".xml")):
with open(xmlroot + "\\eg" + str(i) + ".xml") as xmlfh:
writeCode(pdf, xmlfh.read())
for file in files:
with open(path + "\\" + file) as fh:
writeFileName(pdf, file)
writeCode(pdf, fh.read())
# print(fh.read())
# i[0,i.rfind("\\")-1]
print('info:', info)
pdf.output('spring examples.pdf', 'F')
tuto3.py
from fpdf import FPDF
# title = '20000 Leagues Under the Seas'
title = 'THE ADVENTURES OF SHERLOCK HOLMES'
class PDF(FPDF):
def header(self):
# Arial bold 15
self.set_font('Arial', 'B', 15)
# Calculate width of title and position
w = self.get_string_width(title) + 6
self.set_x((210 - w) / 2)
# Colors of frame, background and text
self.set_draw_color(0, 80, 180)
self.set_fill_color(230, 230, 0)
self.set_text_color(220, 50, 50)
# Thickness of frame (1 mm)
self.set_line_width(1)
# Title
self.cell(w, 9, title, 1, 1, 'C', 1)
# Line break
self.ln(10)
def footer(self):
# Position at 1.5 cm from bottom
self.set_y(-15)
# Arial italic 8
self.set_font('Arial', 'I', 8)
# Text color in gray
self.set_text_color(128)
# Page number
self.cell(0, 10, 'Page ' + str(self.page_no()), 0, 0, 'C')
def chapter_title(self, num, label):
# Arial 12
self.set_font('Arial', '', 12)
# Background color
self.set_fill_color(200, 220, 255)
# Title
self.cell(0, 6, 'Chapter %d : %s' % (num, label), 0, 1, 'L', 1)
# Line break
self.ln(4)
def chapter_body(self, name):
# Read text file
with open(name, 'rb') as f:
txt = f.read().decode('latin-1')
# Times 12
self.set_font('Times', '', 12)
# Output justified text
self.multi_cell(0, 5, txt)
# Line break
self.ln()
# Mention in italics
self.set_font('', 'I')
self.cell(0, 5, '(end of excerpt)')
def print_chapter(self, num, title, name):
self.add_page()
self.chapter_title(num, title)
self.chapter_body(name)
pdf = PDF()
pdf.set_title(title)
pdf.set_author('Arthur Conan Doyle')
# pdf.print_chapter(1, 'A RUNAWAY REEF', '20k_c1.txt')
# pdf.print_chapter(2, 'THE PROS AND CONS', '20k_c2.txt')
pdf.print_chapter(1, 'Chp 1', 'sherlock.txt')
pdf.output('tuto3.pdf', 'F')
色素代码:
pygments2xpre.py (source)
__all__ = ('pygments2xpre',)
def _2xpre(s,styles):
"Helper to transform Pygments HTML output to ReportLab markup"
s = s.replace('<div class="highlight">','')
s = s.replace('</div>','')
s = s.replace('<pre>','')
s = s.replace('</pre>','')
s = s.replace('</span>','</font>')
for k,c in styles+[('p','#000000'),('n','#000000')]:
s = s.replace('<span class="%s">' % k,'<font color="%s">' % c)
return s
def pygments2xpre(s):
"Return markup suitable for XPreformatted"
try:
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import HtmlFormatter
except ImportError:
return s
l = PythonLexer()
h = HtmlFormatter()
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
out = StringIO()
highlight(s,l,h,out)
styles = [(cls, style.split(';')[0].split(':')[1].strip())
for cls, (style, ttype, level) in h.class2style.items()
if cls and style and style.startswith('color:')]
return _2xpre(out.getvalue(),styles)
def convertSourceFiles(filenames):
"Helper function - makes minimal PDF document"
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer, XPreformatted
from reportlab.lib.styles import getSampleStyleSheet
styT=getSampleStyleSheet()["Title"]
styC=getSampleStyleSheet()["Code"]
doc = SimpleDocTemplate("pygments2xpre.pdf")
S = [].append
for filename in filenames:
S(Paragraph(filename,style=styT))
src = open(filename, 'r').read()
fmt = pygments2xpre(src)
S(XPreformatted(fmt, style=styC))
doc.build(S.__self__)
print('saved pygments2xpre.pdf')
convertSourceFiles(['tuto3.py','PdfGenerator.py'])
我遇到以下错误:
warning: Debugger speedups using cython not found. Run '"D:\Programs\python\python-3.6.6-amd64\python.exe" "D:\Programs\Eclipse Neon\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\setup_cython.py" build_ext --inplace' to build.
pydev debugger: starting (pid: 20012)
Traceback (most recent call last):
File "D:\Programs\Eclipse Neon\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\pydevd.py", line 1655, in <module>
main()
File "D:\Programs\Eclipse Neon\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\pydevd.py", line 1649, in main
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\Programs\Eclipse Neon\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\pydevd.py", line 1055, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\Programs\Eclipse Neon\plugins\org.python.pydev.core_6.3.3.201805051638\pysrc\_pydev_imps\_pydev_execfile.py", line 25, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "D:\workspaces\workspace6\PdfGenerator\pygments2xpre.py", line 72, in <module>
convertSourceFiles(['tuto3.py','PdfGenerator.py'])
File "D:\workspaces\workspace6\PdfGenerator\pygments2xpre.py", line 60, in convertSourceFiles
S(XPreformatted(fmt, style=styC))
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\platypus\xpreformatted.py", line 81, in __init__
self._setup(text, style, bulletText, frags, cleaner)
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\platypus\paragraph.py", line 1551, in _setup
style, frags, bulletTextFrags = _parser.parse(text,style)
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\platypus\paraparser.py", line 3217, in parse
annotateException('\nparagraph text %s caused exception' % ascii(text))
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\lib\utils.py", line 1406, in annotateException
rl_reraise(t,v,b)
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\lib\utils.py", line 144, in rl_reraise
raise v
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\platypus\paraparser.py", line 3215, in parse
self.feed(text)
File "D:\Programs\python\python-3.6.6-amd64\lib\html\parser.py", line 111, in feed
self.goahead(0)
File "D:\Programs\python\python-3.6.6-amd64\lib\html\parser.py", line 173, in goahead
k = self.parse_endtag(i)
File "D:\Programs\python\python-3.6.6-amd64\lib\html\parser.py", line 421, in parse_endtag
self.handle_endtag(elem.lower())
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\platypus\paraparser.py", line 3251, in handle_endtag
end()
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\platypus\paraparser.py", line 2833, in end_font
self._pop('font')
File "D:\Programs\python\python-3.6.6-amd64\lib\site-packages\reportlab\platypus\paraparser.py", line 3064, in _pop
raise ValueError('Parse error: saw </%s> instead of expected </%s>' % (tag,frag.__tag__))
ValueError: Parse error: saw </font> instead of expected </span>
paragraph text '<para><span></font><font color="#008000">from</font> <font color="#0000FF">fpdf</font> <font color="#008000">import</font> <font color="#000000">FPDF</font>\n\n<font color="#408080"># title = '20000 Leagues Under the Seas'</font>\n<font color="#000000">title</font> <font color="#666666">=</font> <font color="#BA2121">'THE ADVENTURES OF SHERLOCK HOLMES'</font>\n\n<font color="#008000">class</font> <font color="#0000FF">PDF</font><font color="#000000">(</font><font color="#000000">FPDF</font><font color="#000000">):</font>\n <font color="#008000">def</font> <font color="#0000FF">header</font><font color="#000000">(</font><font color="#008000">self</font><font color="#000000">):</font>\n <font color="#408080"># Arial bold 15</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_font</font><font color="#000000">(</font><font color="#BA2121">'Arial'</font><font color="#000000">,</font> <font color="#BA2121">'B'</font><font color="#000000">,</font> <font color="#666666">15</font><font color="#000000">)</font>\n <font color="#408080"># Calculate width of title and position</font>\n <font color="#000000">w</font> <font color="#666666">=</font> <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">get_string_width</font><font color="#000000">(</font><font color="#000000">title</font><font color="#000000">)</font> <font color="#666666">+</font> <font color="#666666">6</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_x</font><font color="#000000">((</font><font color="#666666">210</font> <font color="#666666">-</font> <font color="#000000">w</font><font color="#000000">)</font> <font color="#666666">/</font> <font color="#666666">2</font><font color="#000000">)</font>\n <font color="#408080"># Colors of frame, background and text</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_draw_color</font><font color="#000000">(</font><font color="#666666">0</font><font color="#000000">,</font> <font color="#666666">80</font><font color="#000000">,</font> <font color="#666666">180</font><font color="#000000">)</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_fill_color</font><font color="#000000">(</font><font color="#666666">230</font><font color="#000000">,</font> <font color="#666666">230</font><font color="#000000">,</font> <font color="#666666">0</font><font color="#000000">)</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_text_color</font><font color="#000000">(</font><font color="#666666">220</font><font color="#000000">,</font> <font color="#666666">50</font><font color="#000000">,</font> <font color="#666666">50</font><font color="#000000">)</font>\n <font color="#408080"># Thickness of frame (1 mm)</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_line_width</font><font color="#000000">(</font><font color="#666666">1</font><font color="#000000">)</font>\n <font color="#408080"># Title</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">cell</font><font color="#000000">(</font><font color="#000000">w</font><font color="#000000">,</font> <font color="#666666">9</font><font color="#000000">,</font> <font color="#000000">title</font><font color="#000000">,</font> <font color="#666666">1</font><font color="#000000">,</font> <font color="#666666">1</font><font color="#000000">,</font> <font color="#BA2121">'C'</font><font color="#000000">,</font> <font color="#666666">1</font><font color="#000000">)</font>\n <font color="#408080"># Line break</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">ln</font><font color="#000000">(</font><font color="#666666">10</font><font color="#000000">)</font>\n\n <font color="#008000">def</font> <font color="#0000FF">footer</font><font color="#000000">(</font><font color="#008000">self</font><font color="#000000">):</font>\n <font color="#408080"># Position at 1.5 cm from bottom</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_y</font><font color="#000000">(</font><font color="#666666">-</font><font color="#666666">15</font><font color="#000000">)</font>\n <font color="#408080"># Arial italic 8</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_font</font><font color="#000000">(</font><font color="#BA2121">'Arial'</font><font color="#000000">,</font> <font color="#BA2121">'I'</font><font color="#000000">,</font> <font color="#666666">8</font><font color="#000000">)</font>\n <font color="#408080"># Text color in gray</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_text_color</font><font color="#000000">(</font><font color="#666666">128</font><font color="#000000">)</font>\n <font color="#408080"># Page number</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">cell</font><font color="#000000">(</font><font color="#666666">0</font><font color="#000000">,</font> <font color="#666666">10</font><font color="#000000">,</font> <font color="#BA2121">'Page '</font> <font color="#666666">+</font> <font color="#008000">str</font><font color="#000000">(</font><font color="#008000">self</font><font color="#666666">.</font><font color="#000000">page_no</font><font color="#000000">()),</font> <font color="#666666">0</font><font color="#000000">,</font> <font color="#666666">0</font><font color="#000000">,</font> <font color="#BA2121">'C'</font><font color="#000000">)</font>\n\n <font color="#008000">def</font> <font color="#0000FF">chapter_title</font><font color="#000000">(</font><font color="#008000">self</font><font color="#000000">,</font> <font color="#000000">num</font><font color="#000000">,</font> <font color="#000000">label</font><font color="#000000">):</font>\n <font color="#408080"># Arial 12</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_font</font><font color="#000000">(</font><font color="#BA2121">'Arial'</font><font color="#000000">,</font> <font color="#BA2121">''</font><font color="#000000">,</font> <font color="#666666">12</font><font color="#000000">)</font>\n <font color="#408080"># Background color</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_fill_color</font><font color="#000000">(</font><font color="#666666">200</font><font color="#000000">,</font> <font color="#666666">220</font><font color="#000000">,</font> <font color="#666666">255</font><font color="#000000">)</font>\n <font color="#408080"># Title</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">cell</font><font color="#000000">(</font><font color="#666666">0</font><font color="#000000">,</font> <font color="#666666">6</font><font color="#000000">,</font> <font color="#BA2121">'Chapter </font><font color="#BB6688">%d</font><font color="#BA2121"> : </font><font color="#BB6688">%s</font><font color="#BA2121">'</font> <font color="#666666">%</font> <font color="#000000">(</font><font color="#000000">num</font><font color="#000000">,</font> <font color="#000000">label</font><font color="#000000">),</font> <font color="#666666">0</font><font color="#000000">,</font> <font color="#666666">1</font><font color="#000000">,</font> <font color="#BA2121">'L'</font><font color="#000000">,</font> <font color="#666666">1</font><font color="#000000">)</font>\n <font color="#408080"># Line break</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">ln</font><font color="#000000">(</font><font color="#666666">4</font><font color="#000000">)</font>\n\n <font color="#008000">def</font> <font color="#0000FF">chapter_body</font><font color="#000000">(</font><font color="#008000">self</font><font color="#000000">,</font> <font color="#000000">name</font><font color="#000000">):</font>\n <font color="#408080"># Read text file</font>\n <font color="#008000">with</font> <font color="#008000">open</font><font color="#000000">(</font><font color="#000000">name</font><font color="#000000">,</font> <font color="#BA2121">'rb'</font><font color="#000000">)</font> <font color="#008000">as</font> <font color="#000000">f</font><font color="#000000">:</font>\n <font color="#000000">txt</font> <font color="#666666">=</font> <font color="#000000">f</font><font color="#666666">.</font><font color="#000000">read</font><font color="#000000">()</font><font color="#666666">.</font><font color="#000000">decode</font><font color="#000000">(</font><font color="#BA2121">'latin-1'</font><font color="#000000">)</font>\n <font color="#408080"># Times 12</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_font</font><font color="#000000">(</font><font color="#BA2121">'Times'</font><font color="#000000">,</font> <font color="#BA2121">''</font><font color="#000000">,</font> <font color="#666666">12</font><font color="#000000">)</font>\n <font color="#408080"># Output justified text</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">multi_cell</font><font color="#000000">(</font><font color="#666666">0</font><font color="#000000">,</font> <font color="#666666">5</font><font color="#000000">,</font> <font color="#000000">txt</font><font color="#000000">)</font>\n <font color="#408080"># Line break</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">ln</font><font color="#000000">()</font>\n <font color="#408080"># Mention in italics</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">set_font</font><font color="#000000">(</font><font color="#BA2121">''</font><font color="#000000">,</font> <font color="#BA2121">'I'</font><font color="#000000">)</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">cell</font><font color="#000000">(</font><font color="#666666">0</font><font color="#000000">,</font> <font color="#666666">5</font><font color="#000000">,</font> <font color="#BA2121">'(end of excerpt)'</font><font color="#000000">)</font>\n\n <font color="#008000">def</font> <font color="#0000FF">print_chapter</font><font color="#000000">(</font><font color="#008000">self</font><font color="#000000">,</font> <font color="#000000">num</font><font color="#000000">,</font> <font color="#000000">title</font><font color="#000000">,</font> <font color="#000000">name</font><font color="#000000">):</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">add_page</font><font color="#000000">()</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">chapter_title</font><font color="#000000">(</font><font color="#000000">num</font><font color="#000000">,</font> <font color="#000000">title</font><font color="#000000">)</font>\n <font color="#008000">self</font><font color="#666666">.</font><font color="#000000">chapter_body</font><font color="#000000">(</font><font color="#000000">name</font><font color="#000000">)</font>\n\n<font color="#000000">pdf</font> <font color="#666666">=</font> <font color="#000000">PDF</font><font color="#000000">()</font>\n<font color="#000000">pdf</font><font color="#666666">.</font><font color="#000000">set_title</font><font color="#000000">(</font><font color="#000000">title</font><font color="#000000">)</font>\n<font color="#000000">pdf</font><font color="#666666">.</font><font color="#000000">set_author</font><font color="#000000">(</font><font color="#BA2121">'Arthur Conan Doyle'</font><font color="#000000">)</font>\n<font color="#408080"># pdf.print_chapter(1, 'A RUNAWAY REEF', '20k_c1.txt')</font>\n<font color="#408080"># pdf.print_chapter(2, 'THE PROS AND CONS', '20k_c2.txt')</font>\n<font color="#000000">pdf</font><font color="#666666">.</font><font color="#000000">print_chapter</font><font color="#000000">(</font><font color="#666666">1</font><font color="#000000">,</font> <font color="#BA2121">'Chp 1'</font><font color="#000000">,</font> <font color="#BA2121">'sherlock.txt'</font><font color="#000000">)</font>\n<font color="#000000">pdf</font><font color="#666666">.</font><font color="#000000">output</font><font color="#000000">(</font><font color="#BA2121">'tuto3.pdf'</font><font color="#000000">,</font> <font color="#BA2121">'F'</font><font color="#000000">)</font></para>' caused exception
为什么会这样? pygments lexers和html formatter是否生成错误的输出?