Обрезка документа 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 координата верхнего правого угла.

Другие вопросы по тегам