GitLab CI中用Pandoc将Java文件转PDF的报错问题求助
可行解决方案及替代方法
方案一:修复pdflatex编译错误(解决特殊字符解析问题)
你之前的pdflatex报错是因为Java代码中的\、_等特殊字符被LaTeX当作命令解析,导致控制序列错误。解决思路是把Java代码包装成Markdown代码块,让pandoc用LaTeX的代码环境渲染,避免解析特殊字符。
修改后的CI配置:
convert_to_pdf: stage: convert image: name: pandoc/latex:edge-alpine entrypoint: [""] script: # 确保输出目录存在 - mkdir -p combined_output # 查找项目目录 - echo "Searching for the directory..." - SB_DIR=$(find . -type d -name "sale") - if [ -z "$SB_DIR" ]; then echo "sale directory not found!"; exit 1; fi # 递归查找所有.java文件 - echo "Listing all .java files within $SB_DIR recursively..." - JAVA_FILES=$(find $SB_DIR -type f -name "*.java") - if [ -z "$JAVA_FILES" ]; then echo "No .java files found!"; exit 1; fi - echo "Found .java files:" - echo "$JAVA_FILES" # 合并所有.java文件 - echo "Combining all .java files into a single file..." - cat $JAVA_FILES > combined_output/all_code.java # 将合并后的Java文件包装成Markdown代码块(关键步骤) - echo "```java" > combined_output/code.md - cat combined_output/all_code.java >> combined_output/code.md - echo "```" >> combined_output/code.md # 转换为PDF,使用listings包渲染代码 - echo "Converting combined file to PDF..." - pandoc -f markdown -o combined_output/output.pdf combined_output/code.md --pdf-engine=pdflatex --listings - echo "PDF conversion completed." artifacts: paths: - combined_output/output.pdf
方案二:用enscript + ps2pdf替代pandoc(更适合代码转PDF)
enscript是专门用于将代码转换为格式化文档的工具,自带Java语法高亮,无需处理LaTeX的特殊字符问题,且Alpine镜像中可以正常安装依赖。
CI配置示例:
convert_to_pdf: stage: convert image: alpine:latest script: # 安装依赖 - apk add --no-cache enscript ghostscript findutils # 创建输出目录 - mkdir -p combined_output # 查找项目目录和Java文件 - SB_DIR=$(find . -type d -name "sale") - if [ -z "$SB_DIR" ]; then echo "sale directory not found!"; exit 1; fi - JAVA_FILES=$(find $SB_DIR -type f -name "*.java") - if [ -z "$JAVA_FILES" ]; then echo "No .java files found!"; exit 1; fi # 合并Java文件 - cat $JAVA_FILES > combined_output/all_code.java # 转换为PDF:enscript生成带语法高亮的PostScript,再转PDF - enscript --language=java --color --output=- combined_output/all_code.java | ps2pdf - combined_output/output.pdf artifacts: paths: - combined_output/output.pdf
方案三:使用完整TeX环境的镜像
如果坚持用pandoc + pdflatex,可以使用包含完整TeXLive的镜像,避免依赖安装失败的问题:
convert_to_pdf: stage: convert image: pandoc/core:latest entrypoint: [""] script: # 安装完整TeX环境及依赖 - apt-get update && apt-get install -y texlive-full ghostscript # 创建输出目录 - mkdir -p combined_output # 查找项目目录和Java文件 - SB_DIR=$(find . -type d -name "sale") - if [ -z "$SB_DIR" ]; then echo "sale directory not found!"; exit 1; fi - JAVA_FILES=$(find $SB_DIR -type f -name "*.java") - if [ -z "$JAVA_FILES" ]; then echo "No .java files found!"; exit 1; fi # 合并Java文件并包装为Markdown代码块 - cat $JAVA_FILES > combined_output/all_code.java - echo "```java" > combined_output/code.md - cat combined_output/all_code.java >> combined_output/code.md - echo "```" >> combined_output/code.md # 转换为PDF - pandoc -f markdown -o combined_output/output.pdf combined_output/code.md --pdf-engine=pdflatex --listings artifacts: paths: - combined_output/output.pdf
内容的提问来源于stack exchange,提问作者saranyat
相关产品推荐
相关产品推荐

