From c0a8f3498630d6dd90f29d38897e8ec01595386a Mon Sep 17 00:00:00 2001 From: Ashley Chiu Date: Sun, 8 Sep 2024 16:45:18 -0700 Subject: [PATCH 01/10] [nit] add link colors to pdf --- .github/workflows/generate-pdf.yml | 2 +- generate-pdf-edits.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index d01b7ce..12ca4ff 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -76,7 +76,7 @@ jobs: ) for md_file in "${file_list[@]}"; do pdf_file_name="pdf_output/$(echo "$md_file" | sed 's/\//_/g' | sed 's/.md//g').pdf" - python3 generate-pdf-edits.py "$md_file" | pandoc -V geometry:margin=1in --pdf-engine=pdflatex -o "$pdf_file_name" + python3 generate-pdf-edits.py "$md_file" | pandoc -V geometry:margin=1in -V colorlinks=true -V linkcolor=blue -V urlcolor=blue --pdf-engine=pdflatex -o "$pdf_file_name" if [ ! -f "$pdf_file_name" ]; then echo "Error: PDF file $pdf_file_name not created!" >&2 diff --git a/generate-pdf-edits.py b/generate-pdf-edits.py index 169ef34..c4081a2 100644 --- a/generate-pdf-edits.py +++ b/generate-pdf-edits.py @@ -1,7 +1,9 @@ import re import argparse -def adjust_images(input_file): +# thanks https://www.reddit.com/r/pandoc/comments/17tsijd/render_htmlsyntax_images_in_pdf_from_markdown/ + +def adjust_content(input_file): # Read the contents of the input file with open(input_file, 'r') as file: content = file.read() @@ -27,4 +29,4 @@ def adjust_images(input_file): args = parser.parse_args() - adjust_images(args.input_file) \ No newline at end of file + adjust_content(args.input_file) \ No newline at end of file From 682f28e98e011faa25cd79f65346540b27d76ad0 Mon Sep 17 00:00:00 2001 From: Ashley Chiu Date: Sun, 8 Sep 2024 16:55:00 -0700 Subject: [PATCH 02/10] switch to pdftk to ensure links remain after uniting --- .github/workflows/generate-pdf.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index 12ca4ff..c0a9158 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -16,8 +16,10 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Install Pandoc, Latex necessities - run: sudo apt-get install -y pandoc texlive texlive-latex-extra poppler-utils texlive-extra-utils + - name: Install Pandoc, Latex necessities, and pdftk + run: | + sudo apt-get install -y pandoc texlive texlive-latex-extra poppler-utils texlive-extra-utils pdftk + - name: Install Python uses: actions/setup-python@v4 with: @@ -83,7 +85,7 @@ jobs: exit 1 fi done - pdfunite \ + pdftk \ "pdf_output/index.pdf" \ "pdf_output/principles_index.pdf" \ "pdf_output/principles_principles.pdf" \ @@ -129,7 +131,7 @@ jobs: "pdf_output/network_abusing-intrusion-detection.pdf" \ "pdf_output/network_malware.pdf" \ "pdf_output/network_tor.pdf" \ - "textbook_full.pdf" + cat output textbook_full.pdf - name: Inject page numbers back into the pdf run: pdfjam --pagecommand '\pagestyle{plain}' --outfile textbook_full.pdf textbook_full.pdf From 42f5394a03af2189cd19da11e4a77fc4553af03e Mon Sep 17 00:00:00 2001 From: Ashley Chiu Date: Sun, 8 Sep 2024 17:04:18 -0700 Subject: [PATCH 03/10] switch to qpdf to ensure links remain after uniting - looks like pdftk doesn't work --- .github/workflows/generate-pdf.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index c0a9158..c2c13cf 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -16,9 +16,9 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Install Pandoc, Latex necessities, and pdftk + - name: Install Pandoc, Latex necessities, and qpdf run: | - sudo apt-get install -y pandoc texlive texlive-latex-extra poppler-utils texlive-extra-utils pdftk + sudo apt-get install -y pandoc texlive texlive-latex-extra poppler-utils texlive-extra-utils qpdf - name: Install Python uses: actions/setup-python@v4 @@ -85,7 +85,7 @@ jobs: exit 1 fi done - pdftk \ + qpdf --empty --pages \ "pdf_output/index.pdf" \ "pdf_output/principles_index.pdf" \ "pdf_output/principles_principles.pdf" \ @@ -131,7 +131,7 @@ jobs: "pdf_output/network_abusing-intrusion-detection.pdf" \ "pdf_output/network_malware.pdf" \ "pdf_output/network_tor.pdf" \ - cat output textbook_full.pdf + -- "textbook_full.pdf" - name: Inject page numbers back into the pdf run: pdfjam --pagecommand '\pagestyle{plain}' --outfile textbook_full.pdf textbook_full.pdf From fc9b3be3e438866502dabdff228ef2040c27eedf Mon Sep 17 00:00:00 2001 From: Ashley Chiu Date: Sun, 8 Sep 2024 17:53:07 -0700 Subject: [PATCH 04/10] switch to pdftk, add numbering in the background --- .github/workflows/generate-pdf.yml | 13 +++++++++---- .gitignore | 7 +++++++ .../generate-pdf-edits.py | 0 pdf-generation/numbering.pdf | Bin 0 -> 10396 bytes pdf-generation/numbering.tex | 6 ++++++ 5 files changed, 22 insertions(+), 4 deletions(-) rename generate-pdf-edits.py => pdf-generation/generate-pdf-edits.py (100%) create mode 100644 pdf-generation/numbering.pdf create mode 100644 pdf-generation/numbering.tex diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index c2c13cf..42bebfa 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -78,14 +78,15 @@ jobs: ) for md_file in "${file_list[@]}"; do pdf_file_name="pdf_output/$(echo "$md_file" | sed 's/\//_/g' | sed 's/.md//g').pdf" - python3 generate-pdf-edits.py "$md_file" | pandoc -V geometry:margin=1in -V colorlinks=true -V linkcolor=blue -V urlcolor=blue --pdf-engine=pdflatex -o "$pdf_file_name" + python3 pdf-generation/generate-pdf-edits.py "$md_file" | pandoc -V geometry:margin=1in -V colorlinks=true -V linkcolor=blue -V urlcolor=blue --pdf-engine=pdflatex -o "$pdf_file_name" if [ ! -f "$pdf_file_name" ]; then echo "Error: PDF file $pdf_file_name not created!" >&2 exit 1 fi done - qpdf --empty --pages \ + + pdftk \ "pdf_output/index.pdf" \ "pdf_output/principles_index.pdf" \ "pdf_output/principles_principles.pdf" \ @@ -131,10 +132,14 @@ jobs: "pdf_output/network_abusing-intrusion-detection.pdf" \ "pdf_output/network_malware.pdf" \ "pdf_output/network_tor.pdf" \ - -- "textbook_full.pdf" + cat output "textbook_full_original.pdf" - name: Inject page numbers back into the pdf - run: pdfjam --pagecommand '\pagestyle{plain}' --outfile textbook_full.pdf textbook_full.pdf + run: | + num_pages=$(pdfinfo textbook_full.pdf | grep Pages | awk '{print $2}') + sed -i "s/NUMBER/$num_pages/" pdf-generation/numbering.tex + pdflatex pdf-generation/numbering.tex + pdftk textbook_full_original.pdf background pdf-generation/numbering.pdf output textbook_full.pdf - name: Remove temporary files, make temporary copy to upload as artifact run: | diff --git a/.gitignore b/.gitignore index e4f8058..a03e3a6 100644 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,10 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/macos,windows,jekyll,node + +# PDF Page Numbering +pdf-generation/numbering.aux +pdf-generation/numbering.fdb_latexmk +pdf-generation/numbering.fls +pdf-generation/numbering.log +pdf-generation/numbering.synctex.gz \ No newline at end of file diff --git a/generate-pdf-edits.py b/pdf-generation/generate-pdf-edits.py similarity index 100% rename from generate-pdf-edits.py rename to pdf-generation/generate-pdf-edits.py diff --git a/pdf-generation/numbering.pdf b/pdf-generation/numbering.pdf new file mode 100644 index 0000000000000000000000000000000000000000..39cdd332a70c73a04066c3ddc698c04a7d552169 GIT binary patch literal 10396 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 Date: Sun, 8 Sep 2024 17:55:51 -0700 Subject: [PATCH 05/10] add back pdftk --- .github/workflows/generate-pdf.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index 42bebfa..7b15617 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -16,9 +16,9 @@ jobs: - name: Checkout code uses: actions/checkout@v3 - - name: Install Pandoc, Latex necessities, and qpdf + - name: Install Pandoc, Latex necessities, and pdftk run: | - sudo apt-get install -y pandoc texlive texlive-latex-extra poppler-utils texlive-extra-utils qpdf + sudo apt-get install -y pandoc texlive texlive-latex-extra poppler-utils texlive-extra-utils pdftk - name: Install Python uses: actions/setup-python@v4 From 320f651c9649903dc95837dc39418f7d865a5d34 Mon Sep 17 00:00:00 2001 From: Ashley Chiu Date: Sun, 8 Sep 2024 18:03:56 -0700 Subject: [PATCH 06/10] fix numbering count --- .github/workflows/generate-pdf.yml | 2 +- .gitignore | 1 + pdf-generation/numbering.pdf | Bin 10396 -> 0 bytes pdf-generation/numbering.tex | 2 +- 4 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 pdf-generation/numbering.pdf diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index 7b15617..3c180f3 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -136,7 +136,7 @@ jobs: - name: Inject page numbers back into the pdf run: | - num_pages=$(pdfinfo textbook_full.pdf | grep Pages | awk '{print $2}') + num_pages=$(pdftk your_file.pdf dump_data | grep NumberOfPages | awk '{print $2}') sed -i "s/NUMBER/$num_pages/" pdf-generation/numbering.tex pdflatex pdf-generation/numbering.tex pdftk textbook_full_original.pdf background pdf-generation/numbering.pdf output textbook_full.pdf diff --git a/.gitignore b/.gitignore index a03e3a6..464d905 100644 --- a/.gitignore +++ b/.gitignore @@ -213,6 +213,7 @@ $RECYCLE.BIN/ # PDF Page Numbering pdf-generation/numbering.aux +pdf-generation/numbering.pdf pdf-generation/numbering.fdb_latexmk pdf-generation/numbering.fls pdf-generation/numbering.log diff --git a/pdf-generation/numbering.pdf b/pdf-generation/numbering.pdf deleted file mode 100644 index 39cdd332a70c73a04066c3ddc698c04a7d552169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10396 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 Date: Sun, 8 Sep 2024 18:08:07 -0700 Subject: [PATCH 07/10] add back the numbering pdf --- .gitignore | 1 - pdf-generation/numbering.pdf | Bin 0 -> 43241 bytes 2 files changed, 1 deletion(-) create mode 100644 pdf-generation/numbering.pdf diff --git a/.gitignore b/.gitignore index 464d905..a03e3a6 100644 --- a/.gitignore +++ b/.gitignore @@ -213,7 +213,6 @@ $RECYCLE.BIN/ # PDF Page Numbering pdf-generation/numbering.aux -pdf-generation/numbering.pdf pdf-generation/numbering.fdb_latexmk pdf-generation/numbering.fls pdf-generation/numbering.log diff --git a/pdf-generation/numbering.pdf b/pdf-generation/numbering.pdf new file mode 100644 index 0000000000000000000000000000000000000000..741ae7d5ef40c74cd98a11863049a64150627d65 GIT binary patch literal 43241 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 literal 0 HcmV?d00001 From 6ba6ba3974987505f45fd04c6682b324f1c2a9b0 Mon Sep 17 00:00:00 2001 From: Ashley Chiu Date: Sun, 8 Sep 2024 18:25:55 -0700 Subject: [PATCH 08/10] correctly number pages --- .github/workflows/generate-pdf.yml | 15 ++++++++++++--- pdf-generation/numbering.pdf | Bin 43241 -> 37886 bytes pdf-generation/numbering.tex | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index 3c180f3..5ac6062 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -136,14 +136,23 @@ jobs: - name: Inject page numbers back into the pdf run: | - num_pages=$(pdftk your_file.pdf dump_data | grep NumberOfPages | awk '{print $2}') - sed -i "s/NUMBER/$num_pages/" pdf-generation/numbering.tex + mkdir -p pdf_numbering_output + + num_pages=$(pdftk textbook_full_original.pdf dump_data | grep NumberOfPages | awk '{print $2}') + sed -i "s/161/$num_pages/" pdf-generation/numbering.tex pdflatex pdf-generation/numbering.tex - pdftk textbook_full_original.pdf background pdf-generation/numbering.pdf output textbook_full.pdf + pdftk pdf-generation/numbering.pdf burst output pdf_numbering_output/number_%03d.pdf + pdftk textbook_full_original.pdf burst output pdf_numbering_output/page_%03d.pdf + for i in $(seq -f %03g 1 $num_pages) ; do pdftk pdf_numbering_output/page_$i.pdf background pdf_numbering_output/number_$i.pdf output pdf_numbering_output/new_$i.pdf; done + + pdftk pdf_numbering_output/new_???.pdf output textbook_full.pdf + + sed -i "s/$num_pages/161/" pdf-generation/numbering.tex - name: Remove temporary files, make temporary copy to upload as artifact run: | rm -rf pdf_output + rm -rf pdf_numbering_output cp textbook_full.pdf textbook_full_cpy.pdf - name: Upload PDF as an artifact diff --git a/pdf-generation/numbering.pdf b/pdf-generation/numbering.pdf index 741ae7d5ef40c74cd98a11863049a64150627d65..8d80bb5057af14ea3b3558d3f7e3bb7801e33e7f 100644 GIT binary patch delta 2811 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 Date: Sun, 8 Sep 2024 18:32:57 -0700 Subject: [PATCH 09/10] check that the sed completed prior to continuing --- .github/workflows/generate-pdf.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index 5ac6062..5653211 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -140,6 +140,13 @@ jobs: num_pages=$(pdftk textbook_full_original.pdf dump_data | grep NumberOfPages | awk '{print $2}') sed -i "s/161/$num_pages/" pdf-generation/numbering.tex + + # Don't continue if the sed failed + if [ $? -ne 0 ]; then + echo "Error: sed command failed" >&2 + exit 1 + fi + pdflatex pdf-generation/numbering.tex pdftk pdf-generation/numbering.pdf burst output pdf_numbering_output/number_%03d.pdf pdftk textbook_full_original.pdf burst output pdf_numbering_output/page_%03d.pdf From aad7c0c7e4953a35c4d0fe07749fe807a3320bf7 Mon Sep 17 00:00:00 2001 From: Ashley Chiu Date: Sun, 8 Sep 2024 18:37:29 -0700 Subject: [PATCH 10/10] fix current page numbering --- .github/workflows/generate-pdf.yml | 4 ++-- pdf-generation/numbering.pdf | Bin 37886 -> 43568 bytes pdf-generation/numbering.tex | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/generate-pdf.yml b/.github/workflows/generate-pdf.yml index 5653211..a8059b3 100644 --- a/.github/workflows/generate-pdf.yml +++ b/.github/workflows/generate-pdf.yml @@ -139,7 +139,7 @@ jobs: mkdir -p pdf_numbering_output num_pages=$(pdftk textbook_full_original.pdf dump_data | grep NumberOfPages | awk '{print $2}') - sed -i "s/161/$num_pages/" pdf-generation/numbering.tex + sed -i "s/194/$num_pages/" pdf-generation/numbering.tex # Don't continue if the sed failed if [ $? -ne 0 ]; then @@ -154,7 +154,7 @@ jobs: pdftk pdf_numbering_output/new_???.pdf output textbook_full.pdf - sed -i "s/$num_pages/161/" pdf-generation/numbering.tex + sed -i "s/$num_pages/194/" pdf-generation/numbering.tex - name: Remove temporary files, make temporary copy to upload as artifact run: | diff --git a/pdf-generation/numbering.pdf b/pdf-generation/numbering.pdf index 8d80bb5057af14ea3b3558d3f7e3bb7801e33e7f..c7f1b859ffa730ce017479ee5411a931daa7e0aa 100644 GIT binary patch delta 5089 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 MEr_C`krfg0AG}H!@Bjb+ delta 2843 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