使用Itextsharp裁剪pdf的左侧

使用Itextsharp裁剪pdf的左侧,pdf,itextsharp,Pdf,Itextsharp,我正在尝试将pdf的左侧裁剪为10毫米。我使用了下面的代码 public void TrimLeftstring sourceFilePath、string outputFilePath { PdfReader pdfReader = new PdfReader(sourceFilePath); float width =(float) GetPDFwidth(sourceFilePath); float height = (float)GetP

我正在尝试将pdf的左侧裁剪为10毫米。我使用了下面的代码 public void TrimLeftstring sourceFilePath、string outputFilePath {

        PdfReader pdfReader = new PdfReader(sourceFilePath);
        float  width =(float) GetPDFwidth(sourceFilePath);
        float height = (float)GetPDFHeight(sourceFilePath);
        float widthTo_Trim = iTextSharp.text.Utilities.MillimetersToPoints(10);
        // Set which part of the source document will be copied.

        // PdfRectangel(bottom-left-x, bottom-left-y, upper-right-x, upper-right-y)

        PdfRectangle rect = new PdfRectangle(0, 0, width - widthTo_Trim, height);
        PdfRectangle rectLeftside = new PdfRectangle(0,0,width - widthTo_Trim, height);
        using (var output = new FileStream(outputFilePath, FileMode.CreateNew, FileAccess.Write))
        {
            // Create a new document
            Document doc = new Document();

            // Make a copy of the document
            PdfSmartCopy smartCopy = new PdfSmartCopy(doc, output);

            // Open the newly created document
            doc.Open();

            // Loop through all pages of the source document
            for (int i = 1; i <= pdfReader.NumberOfPages; i++)
            {
                // Get a page
                var page = pdfReader.GetPageN(i);

                // Apply the rectangle filter we created
                page.Put(PdfName.CROPBOX, rectLeftside);
                page.Put(PdfName.MEDIABOX, rectLeftside);

                // Copy the content and insert into the new document
                var copiedPage = smartCopy.GetImportedPage(pdfReader, i);
                smartCopy.AddPage(copiedPage);
            }

            // Close the output document
            doc.Close();

        }
    }
它是pdf的交叉RHS。我试着改变坐标 PdfRectangle rectLeftside=新的PdfRectangle0,0,宽度-宽度到_修剪,高度; 但无法达到预期的效果。 我如何裁剪X mm的左侧

使评论中的提示成为实际答案

创建新的裁剪框矩形,如下所示:

PdfRectangle rectLeftside = new PdfRectangle(0,0,width - widthTo_Trim, height);
有关的建造商是:

/**
 * Constructs a <CODE>PdfRectangle</CODE>-object.
 *
 * @param       llx         lower left x
 * @param       lly         lower left y
 * @param       urx         upper right x
 * @param       ury         upper right y
 */
...
public PdfRectangle(float llx, float lly, float urx, float ury)
因此,假设您的原始PDF有一个左下角坐标为0,0的裁剪框,那么您的代码将操纵右上角的x,即框的右侧。另一方面,您实际上希望操纵左侧。因此,您应该使用以下方法:

PdfRectangle rectLeftside = new PdfRectangle(widthTo_Trim, 0, width, height);
在评论中的提示之后,这也是OP的解决方案

其他改进 使用PdfStamper OP使用PdfSmartCopy实例及其方法GetImportedPage裁剪pdf的左侧。虽然这已经比使用普通PdfWriter来完成此任务要好,但操作单个pdf的最佳选择通常是PdfStamper:您不必再复制任何内容,只需应用更改。此外,结果在内部更像是原作

逐页确定框 他的代码中的OP假设

PDF中所有页面的恒定大小,由他在方法GetPDFwidth和GetPDFHeight中确定,以及 所有页面上当前裁剪框的恒定左下坐标0,0。 这两种假设都不适用于所有PDF。因此,应该分别检索和操作每个页面的裁剪框

代码 让评论中的暗示成为实际的答案

创建新的裁剪框矩形,如下所示:

PdfRectangle rectLeftside = new PdfRectangle(0,0,width - widthTo_Trim, height);
有关的建造商是:

/**
 * Constructs a <CODE>PdfRectangle</CODE>-object.
 *
 * @param       llx         lower left x
 * @param       lly         lower left y
 * @param       urx         upper right x
 * @param       ury         upper right y
 */
...
public PdfRectangle(float llx, float lly, float urx, float ury)
因此,假设您的原始PDF有一个左下角坐标为0,0的裁剪框,那么您的代码将操纵右上角的x,即框的右侧。另一方面,您实际上希望操纵左侧。因此,您应该使用以下方法:

PdfRectangle rectLeftside = new PdfRectangle(widthTo_Trim, 0, width, height);
在评论中的提示之后,这也是OP的解决方案

其他改进 使用PdfStamper OP使用PdfSmartCopy实例及其方法GetImportedPage裁剪pdf的左侧。虽然这已经比使用普通PdfWriter来完成此任务要好,但操作单个pdf的最佳选择通常是PdfStamper:您不必再复制任何内容,只需应用更改。此外,结果在内部更像是原作

逐页确定框 他的代码中的OP假设

PDF中所有页面的恒定大小,由他在方法GetPDFwidth和GetPDFHeight中确定,以及 所有页面上当前裁剪框的恒定左下坐标0,0。 这两种假设都不适用于所有PDF。因此,应该分别检索和操作每个页面的裁剪框

代码
A这对PdfStamper来说更像是一项任务,而不是PdfCopy类的任务。B您是否尝试过PdfRectangle rectLeftside=新的PdfRectanglewidthTo_Trim,0,width-widthTo_Trim,height;?通过使用PdfRectangle rectLeftside=新的PdfRectanglewidthTo_Trim,0,width,height得到了一个解决方案;您可能想自己给出一个答案。好的,我推导了一个ans从我们的评论中可以看出。A这对于PdfStamper来说比对于PdfCopy类来说更像是一项任务。B您是否尝试过PdfRectangle rectLeftside=新的PdfRectanglewidthTo_Trim,0,width-widthTo_Trim,height;?通过使用PdfRectangle rectLeftside=新的PdfRectanglewidthTo_Trim,0,width,height;?获得了解决方案;您可能希望自己给出答案。Ok、 因此,我从我们的评论中得出了答案。