awacke1 commited on
Commit
f9e1314
ยท
verified ยท
1 Parent(s): 1f95b78

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -28
app.py CHANGED
@@ -339,16 +339,18 @@ def pdf_to_image(pdf_bytes):
339
  st.error(f"Failed to render PDF preview: {e}")
340
  return None
341
 
342
- # PDF creation and linking function
343
- WORDS = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
 
 
344
 
345
- def create_and_link_pdfs(source_pdf="TestSource.pdf", target_pdf="TestTarget.pdf"):
346
- """Create two PDFs with numbered lists, add links and bookmarks."""
347
  def create_base_pdf(filename):
348
  buffer = io.BytesIO()
349
  c = canvas.Canvas(buffer)
350
  c.setFont("Helvetica", 12)
351
- for i, word in enumerate(WORDS, 1):
352
  y = 800 - (i * 20)
353
  c.drawString(50, y, f"{i}. {word}")
354
  c.showPage()
@@ -386,7 +388,6 @@ def create_and_link_pdfs(source_pdf="TestSource.pdf", target_pdf="TestTarget.pdf
386
  text_pdf = PdfReader(buffer)
387
  page = writer.pages[0]
388
  page.merge_page(text_pdf.pages[0])
389
- # Correctly include url parameter
390
  link = Link(
391
  rect=(90, seven_y - 10, 150, seven_y + 10),
392
  url=f"file://{os.path.abspath(target)}#page=1"
@@ -420,6 +421,69 @@ def create_and_link_pdfs(source_pdf="TestSource.pdf", target_pdf="TestTarget.pdf
420
  add_internal_link(target_pdf)
421
  return source_pdf, target_pdf
422
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
423
  # Streamlit UI
424
  md_files = [f for f in glob.glob("*.md") if os.path.basename(f) != "README.md"]
425
  md_options = [os.path.splitext(os.path.basename(f))[0] for f in md_files]
@@ -516,9 +580,9 @@ with st.sidebar:
516
  mime="audio/mpeg"
517
  )
518
 
519
- if st.button("๐Ÿ“‘ Create Linked PDFs"):
520
- with st.spinner("Creating and linking PDFs..."):
521
- source_pdf, target_pdf = create_and_link_pdfs()
522
  st.success(f"Created {source_pdf} and {target_pdf}")
523
  for pdf_file in [source_pdf, target_pdf]:
524
  with open(pdf_file, "rb") as f:
@@ -529,25 +593,24 @@ with st.sidebar:
529
  mime="application/pdf"
530
  )
531
 
532
- if st.button("๐Ÿงช Test PDFs"):
533
- with st.spinner("Generating and testing PDFs..."):
534
- source_pdf, target_pdf = create_and_link_pdfs()
535
- st.success(f"Generated {source_pdf} and {target_pdf}")
536
- for pdf_file in [source_pdf, target_pdf]:
537
- with open(pdf_file, "rb") as f:
538
- pdf_bytes = f.read()
539
- images = pdf_to_image(pdf_bytes)
540
- if images:
541
- st.subheader(f"Preview of {pdf_file}")
542
- for img in images:
543
- st.image(img, caption=f"{pdf_file} Page", use_container_width=True)
544
- with open(pdf_file, "rb") as f:
545
- st.download_button(
546
- label=f"๐Ÿ’พ Download {pdf_file}",
547
- data=f.read(),
548
- file_name=pdf_file,
549
- mime="application/pdf"
550
- )
551
 
552
  with st.spinner("Generating PDF..."):
553
  pdf_bytes = create_pdf(st.session_state.markdown_content, base_font_size, render_with_bold, auto_bold_numbers, enlarge_numbered, num_columns, add_space_before_numbered, headings_to_fonts)
 
339
  st.error(f"Failed to render PDF preview: {e}")
340
  return None
341
 
342
+ # PDF creation and linking functions
343
+ WORDS_10 = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
344
+ WORDS_20 = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
345
+ "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"]
346
 
347
+ def create_crossfile_pdfs(source_pdf="TestSource.pdf", target_pdf="TestTarget.pdf"):
348
+ """Create two PDFs with cross-file linking."""
349
  def create_base_pdf(filename):
350
  buffer = io.BytesIO()
351
  c = canvas.Canvas(buffer)
352
  c.setFont("Helvetica", 12)
353
+ for i, word in enumerate(WORDS_10, 1):
354
  y = 800 - (i * 20)
355
  c.drawString(50, y, f"{i}. {word}")
356
  c.showPage()
 
388
  text_pdf = PdfReader(buffer)
389
  page = writer.pages[0]
390
  page.merge_page(text_pdf.pages[0])
 
391
  link = Link(
392
  rect=(90, seven_y - 10, 150, seven_y + 10),
393
  url=f"file://{os.path.abspath(target)}#page=1"
 
421
  add_internal_link(target_pdf)
422
  return source_pdf, target_pdf
423
 
424
+ def create_selflinking_pdf(pdf_file="SelfLinking.pdf"):
425
+ """Create a PDF with a TOC on page 1 linking to a 1-20 list starting on page 2."""
426
+ buffer = io.BytesIO()
427
+ c = canvas.Canvas(buffer)
428
+
429
+ # Page 1: Table of Contents
430
+ c.setFont("Helvetica", 14)
431
+ c.drawString(50, 800, "Table of Contents")
432
+ c.setFont("Helvetica", 12)
433
+ toc_y_positions = []
434
+ for i, word in enumerate(WORDS_10, 1):
435
+ y = 760 - (i * 20)
436
+ c.drawString(50, y, f"{word}")
437
+ toc_y_positions.append(y)
438
+ c.showPage()
439
+
440
+ # Page 2: Numbered list 1-20
441
+ c.setFont("Helvetica", 12)
442
+ list_y_positions = []
443
+ for i, word in enumerate(WORDS_20, 1):
444
+ y = 800 - (i * 20)
445
+ c.drawString(50, y, f"{i}. {word}")
446
+ list_y_positions.append(y)
447
+ c.showPage()
448
+
449
+ # Save the initial PDF
450
+ c.save()
451
+ buffer.seek(0)
452
+ with open(pdf_file, "wb") as f:
453
+ f.write(buffer.getvalue())
454
+ buffer.close()
455
+
456
+ # Add outlines and links
457
+ reader = PdfReader(pdf_file)
458
+ writer = PdfWriter()
459
+ for page in reader.pages:
460
+ writer.add_page(page)
461
+
462
+ # Add outline entries
463
+ toc_page = writer.pages[0]
464
+ list_page = writer.pages[1]
465
+ writer.add_outline_item("Table of Contents", 0, fit=Fit(fit_type="/Fit"))
466
+ for i, word in enumerate(WORDS_10, 1):
467
+ y = list_y_positions[i-1]
468
+ writer.add_outline_item(word, 1, fit=Fit(fit_type="/XYZ", fit_args=[50, y, 0]))
469
+
470
+ # Add TOC links from page 1 to page 2
471
+ for i, word in enumerate(WORDS_10):
472
+ toc_y = toc_y_positions[i]
473
+ list_y = list_y_positions[i]
474
+ link = Link(
475
+ rect=(50, toc_y - 10, 150, toc_y + 10),
476
+ target_page_index=1,
477
+ fit=Fit(fit_type="/XYZ", fit_args=[50, list_y, 0])
478
+ )
479
+ writer.add_annotation(page_number=0, annotation=link)
480
+
481
+ # Save the modified PDF
482
+ with open(pdf_file, "wb") as f:
483
+ writer.write(f)
484
+
485
+ return pdf_file
486
+
487
  # Streamlit UI
488
  md_files = [f for f in glob.glob("*.md") if os.path.basename(f) != "README.md"]
489
  md_options = [os.path.splitext(os.path.basename(f))[0] for f in md_files]
 
580
  mime="audio/mpeg"
581
  )
582
 
583
+ if st.button("๐Ÿ“‘ Create CrossFile PDFs"):
584
+ with st.spinner("Creating cross-file linked PDFs..."):
585
+ source_pdf, target_pdf = create_crossfile_pdfs()
586
  st.success(f"Created {source_pdf} and {target_pdf}")
587
  for pdf_file in [source_pdf, target_pdf]:
588
  with open(pdf_file, "rb") as f:
 
593
  mime="application/pdf"
594
  )
595
 
596
+ if st.button("๐Ÿงช Create SelfLinking PDF"):
597
+ with st.spinner("Generating self-linking PDF with TOC..."):
598
+ pdf_file = create_selflinking_pdf()
599
+ st.success(f"Generated {pdf_file}")
600
+ with open(pdf_file, "rb") as f:
601
+ pdf_bytes = f.read()
602
+ images = pdf_to_image(pdf_bytes)
603
+ if images:
604
+ st.subheader(f"Preview of {pdf_file}")
605
+ for i, img in enumerate(images):
606
+ st.image(img, caption=f"{pdf_file} Page {i+1}", use_container_width=True)
607
+ with open(pdf_file, "rb") as f:
608
+ st.download_button(
609
+ label=f"๐Ÿ’พ Download {pdf_file}",
610
+ data=f.read(),
611
+ file_name=pdf_file,
612
+ mime="application/pdf"
613
+ )
 
614
 
615
  with st.spinner("Generating PDF..."):
616
  pdf_bytes = create_pdf(st.session_state.markdown_content, base_font_size, render_with_bold, auto_bold_numbers, enlarge_numbered, num_columns, add_space_before_numbered, headings_to_fonts)