Пример

Пример

Обходной путь — использовать pdfcropотдельную функцию (в терминале) для обрезки PDF-файла, который мы хотим импортировать.

Однако есть ли способ удалить белые поля при импорте PDF-файла из самого texфайла?

Два распространенных пакета для импорта файлов PDF — это pdfpagesили graphicx. Могу ли я «предварительно обработать» файл для них с pdfcropпомощью texфайла?

решение1

Новая команда, которая работает так же \includegraphics, но обрезает изображение PDF:

\newcommand{\includeCroppedPdf}[2][]{%
    \immediate\write18{pdfcrop #2}%
    \includegraphics[#1]{#2-crop}}

Помнить: \write18необходимо включить. Для большинства дистрибутивов TeX установите --shell-escapeфлаг при запуске latex/ pdflatexи т.д.

Пример

\documentclass{article}

\usepackage{graphicx}

\newcommand{\includeCroppedPdf}[2][]{%
    \immediate\write18{pdfcrop #2}%
    \includegraphics[#1]{#2-crop}}

\begin{document}
    \includeCroppedPdf[width=\textwidth]{test}
\end{document}

Избегайте обрезки при каждой компиляции

Чтобы избежать обрезки при каждой компиляции документа, вы можете проверить, существует ли уже обрезанный файл. (лучше использовать контрольную сумму)

\documentclass{article}

\usepackage{graphicx}

\newcommand{\includeCroppedPdf}[2][]{%
    \IfFileExists{./#2-crop.pdf}{}{%
        \immediate\write18{pdfcrop #2 #2-crop.pdf}}%
    \includegraphics[#1]{#2-crop.pdf}}

\begin{document}
    \includeCroppedPdf[width=\textwidth]{test}
\end{document} 

Пример контрольной суммы MD5

Идея заключается в том, чтобы сохранить MD5 изображения и сравнить его при следующем запуске. Для этого требуется макрос \pdf@filemdfivesum(работает только с PDFLaTeXили LuaLaTeX). Для этого XeLaTeXвы можете использовать утилиту \write18with md5sumили сделать файл diff.

\documentclass{article}

\usepackage{graphicx}

\usepackage{etoolbox}

\makeatletter
\newcommand{\includeCroppedPdf}[2][]{\begingroup%
    \edef\temp@mdfivesum{\pdf@filemdfivesum{#2.pdf}}%
    \ifcsstrequal{#2mdfivesum}{temp@mdfivesum}{}{%
        %file changed
        \immediate\write18{pdfcrop #2 #2-crop.pdf}}%
        \immediate\write\@auxout{\string\expandafter\string\gdef\string\csname\space #2mdfivesum\string\endcsname{\temp@mdfivesum}}%
    \includegraphics[#1]{#2-crop.pdf}\endgroup}
\makeatother

\begin{document}
    \includeCroppedPdf[width=\textwidth]{abc}
\end{document}

решение2

Если у кого-то возникли проблемы из-за пробелов в пути к имени файла, вот решение:

\documentclass{article}

\usepackage{graphicx}

\usepackage{etoolbox}

\makeatletter
\newcommand{\includeCroppedPdf}[2][]{\begingroup%
    \edef\temp@mdfivesum{\pdf@filemdfivesum{"#2.pdf"}}%
    \ifcsstrequal{#2mdfivesum}{temp@mdfivesum}{}{%
        %file changed
        \immediate\write18{pdfcrop "#2.pdf" "#2-crop.pdf"}}%
        \immediate\write\@auxout{\string\expandafter\string\gdef\string\csname\space #2mdfivesum\string\endcsname{\temp@mdfivesum}}%
    \includegraphics[#1]{"#2-crop"}\endgroup}
\makeatother

\begin{document}
    \includeCroppedPdf[width=\textwidth]{./path to file with spaces/abc efg}
\end{document}

Примечание: Не работает при \graphicspathизменении

Связанный контент