PdfSmartCopy正在复制新PDF文件底部(页脚)的内容

时间:2014-05-31 07:19:12

标签: c# pdf itextsharp

我有一个函数,它正在裁剪pdf文件的特定部分并将其添加到新的Pdf文件中,但我得到的主要问题是它将页面的裁剪部分显示在底部(页脚)新创建的pdf文件。 这是代码..

public static void CropPdfFile(string sourceFilePath, string outputFilePath)
{
    // Allows PdfReader to read a pdf document without the owner's password
    PdfReader.unethicalreading = true;

    // Reads the PDF document
    using (PdfReader pdfReader = new PdfReader(sourceFilePath))
    {
        // 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(0f, 9049.172f, 594.0195f, 700.3f);

        using (var output = new FileStream(outputFilePath, FileMode.CreateNew, FileAccess.Write))
        {
            // Create a new document
            using (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 = 4; i <= pdfReader.NumberOfPages; i++)
                {
                    // Get a page
                    var page = pdfReader.GetPageN(i);

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

                    // Copy the content and insert into the new document

                      smartCopy.SetLinearPageMode();

                    var copiedPage = smartCopy.GetImportedPage(pdfReader, i);
                    smartCopy.AddPage(copiedPage);

                }

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

请帮我解决这个问题..

1 个答案:

答案 0 :(得分:0)

PDF页面的大小(以用户单位表示)取决于媒体框的值。例如:A4页面的媒体框通常定义为[0 0 595 842]

在这种情况下,坐标系(0,0)的原点与左下角重合。右上角的坐标是(595,842)。

A4页面的另一个可能值是[0 842 595 1684]。相同宽度(595个用户单位),相同高度(1684 - 842 = 842个用户单位),但左下角现在有坐标(0,842),右上角坐标是(595,1684)

您写道使用以下参数创建PdfRectangle :( bottom-left-x,bottom-left-y,upper-right-x,upper-right-y)。但是,您使用的是这些硬编码值:0f, 9049.172f, 594.0195f, 700.3f

你的左下角(9049.172)位于比右上角y(700.3)更高的位置。这没有多大意义。因此:您应该考虑将该值更改为有意义的值。应该是什么值,这是一个只有你能回答的问题,因为只有你知道要裁剪的文件的MediaBox的价值。

在评论中,您解释说您的PDF是A4页面。您可以使用名为PdfReader的{​​{1}}方法进行检查。如果您想裁剪页面以便只看到文档的标题,则需要使用以下内容:

getPageSize()

其中PdfRectangle rect = new PdfRectangle(0f, 842 - x, 595, 842); 是标题的高度。例如,如果标题是100个用户单位,那么您需要:

x

目前还不清楚为什么你总是谈论100px。如果您想将像素转换为点数,请阅读Convert Pixels to Points

使用上面提到的公式,100个像素等于75个点。