Spaces:
Runtime error
Runtime error
| import json | |
| import os | |
| import argparse | |
| from md2pdf.core import md2pdf | |
| def json_to_markdown(json_data, filename): | |
| """ | |
| Convert JSON data into a Markdown string. | |
| :param json_data: List of dictionaries each containing | |
| "start", "end", "text", "speaker", "language" | |
| :param filename: The name of the JSON file (used as the main title) | |
| :return: A string of valid Markdown | |
| """ | |
| # Title | |
| title = filename.replace("-paragraphs.json", "") | |
| md_output = f"# {title}\n\n" | |
| # Transcription Header | |
| md_output += "## Transcription\n\n" | |
| # Build the content for each contribution | |
| for entry in json_data: | |
| speaker = entry.get("speaker", "Unknown Speaker") | |
| language = entry.get("language", "Unknown Language") | |
| start = entry.get("start", "") | |
| end = entry.get("end", "") | |
| text = entry.get("text", "") | |
| # Speaker-language heading | |
| md_output += f"### {speaker} - {language}\n\n" | |
| # Table for start/end times | |
| md_output += "| start | end |\n" | |
| md_output += "|-------------|-------------|\n" | |
| md_output += f"| {start} | {end} |\n\n" | |
| # Add the text below the table | |
| md_output += f"{text}\n\n" | |
| return md_output | |
| def save_markdown_to_file(markdown_text, output_md_path): | |
| """ | |
| Save the Markdown text to a file. | |
| :param markdown_text: The Markdown content as a string. | |
| :param output_md_path: The path (including filename) where the .md should be saved. | |
| """ | |
| with open(output_md_path, 'w', encoding='utf-8') as md_file: | |
| md_file.write(markdown_text) | |
| def markdown_to_pdf(markdown_text, output_pdf_path): | |
| """ | |
| Convert a Markdown string to a PDF using md2pdf. | |
| :param markdown_text: The Markdown text to convert. | |
| :param output_pdf_path: The path (including filename) where the PDF should be saved. | |
| """ | |
| # Custom CSS (adapt as you like) | |
| custom_css = r""" | |
| @font-face { | |
| font-family: "Bitstream Vera Serif Bold"; | |
| src: url("https://mdn.github.io/css-examples/web-fonts/VeraSeBd.ttf"); | |
| } | |
| body { | |
| margin: 0 auto; | |
| background-color: white; | |
| font-family: "Bitstream Vera Serif Bold"; | |
| color: #333333; | |
| line-height: 1; | |
| max-width: 800px; | |
| padding: 30px; | |
| font-size: 12px; | |
| } | |
| p { | |
| line-height: 150%; | |
| max-width: 960px; | |
| font-weight: 400; | |
| color: #333333; | |
| } | |
| h1, | |
| h2, | |
| h3, | |
| h4 { | |
| font-weight: 400; | |
| } | |
| h2, | |
| h3, | |
| h4, | |
| h5, | |
| p { | |
| margin-bottom: 25px; | |
| padding: 0; | |
| } | |
| h1 { | |
| margin-bottom: 10px; | |
| font-size: 300%; | |
| padding: 0px; | |
| } | |
| h2 { | |
| font-size: 150%; | |
| } | |
| h3 { | |
| font-size: 120%; | |
| } | |
| h4 { | |
| font-size: 100%; | |
| } | |
| h5 { | |
| font-size: 80%; | |
| font-weight: 100; | |
| } | |
| h6 { | |
| font-size: 80%; | |
| font-weight: 100; | |
| color: red; | |
| } | |
| a { | |
| color: grey; | |
| margin: 0; | |
| padding: 0; | |
| vertical-align: baseline; | |
| } | |
| a:hover { | |
| text-decoration: blink; | |
| color: green; | |
| } | |
| a:visited { | |
| color: black; | |
| } | |
| ul, | |
| ol { | |
| padding: 0; | |
| margin: 0px 0px 0px 50px; | |
| } | |
| ul { | |
| list-style-type: square; | |
| list-style-position: inside; | |
| } | |
| li { | |
| line-height: 150%; | |
| } | |
| li ul, | |
| li ul { | |
| margin-left: 24px; | |
| } | |
| pre { | |
| padding: 0px 24px; | |
| max-width: 800px; | |
| white-space: pre-wrap; | |
| } | |
| code { | |
| font-family: Consolas, Monaco, Andale Mono, monospace; | |
| line-height: 1.5; | |
| font-size: 13px; | |
| } | |
| aside { | |
| display: block; | |
| float: right; | |
| width: 390px; | |
| } | |
| blockquote { | |
| border-left: 0.5em solid #eee; | |
| padding: 0 1em; | |
| margin-left: 0; | |
| max-width: 476px; | |
| } | |
| blockquote cite { | |
| line-height: 20px; | |
| color: #bfbfbf; | |
| } | |
| blockquote cite:before { | |
| content: "\2014 \00A0"; | |
| } | |
| blockquote p { | |
| color: #666; | |
| max-width: 460px; | |
| } | |
| hr { | |
| text-align: left; | |
| margin: 0 auto 0 0; | |
| color: #999; | |
| } | |
| /* Table styling for the start/end times */ | |
| table { | |
| border-collapse: collapse; | |
| width: 100%; | |
| margin-bottom: 15px; | |
| } | |
| table, th, td { | |
| border: 1px solid #333; | |
| padding: 6px; | |
| } | |
| th { | |
| background-color: #eee; | |
| text-align: left; | |
| } | |
| """ | |
| # Convert Markdown to PDF directly from a string | |
| md2pdf(output_pdf_path, | |
| md_content=markdown_text, # We pass the markdown text as "raw" | |
| css_file_path=None, # If you have an external .css file, you can pass its path here | |
| base_url=None # If you have images or relative links | |
| ) | |
| # If we want the custom CSS from a file, we can write it to a temporary file: | |
| # Optionally, you could do something like this: | |
| # | |
| # with open("custom_style.css", "w", encoding="utf-8") as css_file: | |
| # css_file.write(custom_css) | |
| # | |
| # md2pdf(output_pdf_path, | |
| # raw=markdown_text, | |
| # css="custom_style.css", # pass the CSS file path | |
| # extras=[], | |
| # base_url=None | |
| # ) | |
| def parse_args(): | |
| """ | |
| Parse command-line arguments using argparse. | |
| """ | |
| parser = argparse.ArgumentParser( | |
| description="Convert a JSON-based transcription to Markdown and then to PDF using md2pdf." | |
| ) | |
| parser.add_argument("input_filename", | |
| help="Path to the JSON file containing transcription data.") | |
| parser.add_argument("--output_md", | |
| default="transcription.md", | |
| help="Output Markdown file name (default: transcription.md)") | |
| parser.add_argument("--output_pdf", | |
| default="transcription.pdf", | |
| help="Output PDF file name (default: transcription.pdf)") | |
| return parser.parse_args() | |
| def convert_json_to_pdf(input_filename, output_md="transcription.md", output_pdf="transcription.pdf"): | |
| # 1. Read JSON data | |
| with open(input_filename, 'r', encoding='utf-8') as f: | |
| data = json.load(f) | |
| # 2. Convert JSON to Markdown | |
| markdown_output = json_to_markdown(data, os.path.basename(input_filename)) | |
| # 3. Save Markdown to a .md file (optional) | |
| save_markdown_to_file(markdown_output, output_md) | |
| print(f"Markdown saved to: {output_md}") | |
| # 4. Convert Markdown to PDF using md2pdf | |
| markdown_to_pdf(markdown_output, output_pdf) | |
| print(f"PDF generated and saved to: {output_pdf}") | |
| def main(): | |
| args = parse_args() | |
| convert_json_to_pdf(args.input_filename, args.output_md, args.output_pdf) | |
| if __name__ == '__main__': | |
| main() |