Обрезка документа PDF с использованием itext возвращает нежелательный вывод
Я должен обрезать PDF-документ, используя itext, но результирующий выходной pdf не тот, для которого я предоставил связки прямоугольника, чтобы обрезать то же самое. Я загрузил образец файла по этому пути.
https://onedrive.live.com/redir?resid=445455D417418FDD%21123
onedrive.live.com/redir?resid=445455D417418FDD%21124
onedrive.live.com/redir?resid=445455D417418FDD%21125
onedrive.live.com/redir?resid=445455D417418FDD%21126
и я использую этот код.
PdfReader reader = new PdfReader(docpath);
iTextSharp.text.Rectangle size = new iTextSharp.text.Rectangle(24, 144, 270, 348);
iTextSharp.text.Document document = new iTextSharp.text.Document(size);
string tempdocpath = docpath.Replace(".pdf", "_.pdf");
tempdocpath = tempdocpath.Replace(".PDF", "_.PDF");
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(tempdocpath, FileMode.Create, FileAccess.Write));
document.Open();
PdfContentByte cb = writer.DirectContent;
document.NewPage();
PdfImportedPage page = writer.GetImportedPage(reader, pageNumber);
cb.AddTemplate(page, 0, 0);
document.Close();
writer.Close();
2 ответа
Метод Бруно является подходящим методом для обрезки (он бы знал, что он создатель iText). Но так как у вас уже есть путь, который вы пытаетесь пройти, я постараюсь вам помочь.
Вместо настоящей обрезки вы пытаетесь создать новый документ определенного размера, а затем добавить исходный документ, но сместить его, чтобы он соответствовал вашему новому "окну". Конечный результат такой же, как и обрезка, я думаю.
Одна из перегрузок в PdfContentByte.AddTemplate()
это тот, который принимает матрицу преобразования. В вашем случае вы хотите перевести, который определяется [1, 0, 0, 1, tx, ty]
последние два элемента - это то, что вам нужно выяснить. Для этого конкретного документа PDF вы можете использовать:
cb.AddTemplate(page, 1, 0, 0, 1, -36, -36);
РЕДАКТИРОВАТЬ
Волшебный номер -34
должен был на самом деле -36
, извиняюсь. Тот 36
представляет размер различных блоков документа (о которых говорил Бруно), которые уменьшают видимую область документа на 36 от каждого размера. Используя метод, который вы пытаетесь использовать, вам нужно проверить поле обрезки импортированного документа (может быть, Bleed и Trim тоже?) И принять это во внимание.
Я не понимаю ваш пример кода, более конкретно: я не понимаю, почему вы должны обрезать страницы, используя этот код. Позвольте мне игнорировать ваш код и объяснить, как страницы могут быть обрезаны.
Взгляните на пример RotatePages из моей книги. в ManipulatePdf()
метод, я перебираю страницы, беру словарь страниц и меняю /Rotate
ключ, чтобы повернуть страницу. Это не то, что вам нужно, но принцип похож.
Вам нужно получить /MediaBox
а также /CropBox
значение из словаря страницы:
PdfArray mediabox = pageDict.getAsArray(PdfName.MEDIABOX);
PdfArray cropbox = pageDict.getAsArray(PdfName.CROPBOX);
Во многих случаях, cropbox
будет null
в этом случае вы можете смело игнорировать его и использовать mediabox
значение вместо
cropbox
значение (или если null
, mediabox
) является массивом с 4 значениями. Эти значения представляют две координаты: одна для левого нижнего угла страницы, другая для правого верхнего угла страницы. Если вы хотите обрезать страницу, вам нужно изменить эти координаты или заменить существующие cropbox
значение (если оно уже существует) или добавить новый cropbox
значение (если его нет).
pageDict.put(PdfName.CROPBOX, new PdfArray(new float[]{llx, lly, urx, ury}));
куда llx, lly
являются x
а также y
координата нижнего левого угла и urx, ury
являются x
а также y
координата верхнего правого угла.