【问题标题】:Change pageSize of pdf before saving保存前更改pdf的pageSize
【发布时间】:2018-01-23 14:01:22
【问题描述】:

我收到了byte[] 的 pdf。当我将此二进制文件保存为 pdf 时,pageSize 太大了。我想更改代码中的pageSize。

目前我正在尝试这种方式,基于我在其他问题中发现的内容:

using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf; 

using (MemoryStream stream = new MemoryStream(pdfAsBinary))
{
    using (PdfReader reader = new PdfReader(pdfAsBinary))
    {
        using (Document doc = new Document(PageSize.A4))
        {
            PdfWriter writer = PdfWriter.GetInstance(doc, stream);
            PdfImportedPage page = writer.GetImportedPage(reader, 1);


            image = Image.GetInstance(page);
            using (var pdfStream = new FileStream(tempPath, FileMode.Create, FileAccess.ReadWrite, FileShare.Read))
            {
                 PdfWriter pdfwriter = PdfWriter.GetInstance(doc, pdfStream);
                 doc.Open();
                 doc.SetPageSize(PageSize.A4);
                 image.ScalePercent(30f);
                 doc.Add(image);
                 doc.Close();
             }
         }
    }
 File.Copy(tempPath, pathToFile);
 }

或者我尝试使用这种方法:

private static byte[] resizeToA4(byte[] inputDoc)
{
    using (MemoryStream out = new MemoryStream())
    {
        using (PdfReader reader = new PdfReader(inputDoc))
        {
            using (Document doc = new Document(PageSize.A4))
            {
                PdfWriter writer = PdfWriter.GetInstance(doc, out);
            }
        }
    return outPDF.ToArray();
    }

以上都不起作用,感觉我把事情复杂化了。如何将 pageSize 调整为 A4?

【问题讨论】:

  • “两者都不起作用”是什么意思?
  • 我的意思是“以上都不是”
  • 什么是PdfReader?如果您使用的是第三方库,如果您告诉我们是哪一个,它会对我们有所帮助。如果遇到错误,包含异常堆栈跟踪会有所帮助。
  • 外部库是:使用 iTextSharp;使用 iTextSharp.text;使用 iTextSharp.text.pdf;
  • 你可能想看看this old answer;它适用于 Java 的 iText,但移植到 C# 应该不会太难。只需从您的 byte[] 初始化 PdfReader 而不是该答案中使用的文件。

标签: c# .net pdf stream itext


【解决方案1】:

此方法适用于一页文件。

    public static void ScaleToA4self(byte[] pdfAsBinary, string locationOfPdfOut)
    {
        PdfReader reader = new PdfReader(pdfAsBinary);
        Rectangle originalSize = reader.GetPageSize(1);
        float originalHeight = originalSize.Height;
        float originalWidth = originalSize.Width;

        Rectangle newSize = PageSize.A4;
        float newHeight = newSize.Height;
        float newWidth = newSize.Width;
        float scaleHeight = newHeight / originalHeight;
        float scaleWidth = newWidth / originalWidth;

        Document doc = new Document(newSize, 0, 0, 0, 0);
        PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(locationOfPdfOut, FileMode.Create));
        doc.Open();
        PdfContentByte cb = writer.DirectContent;
        PdfImportedPage page = writer.GetImportedPage(reader, 1);

        cb.AddTemplate(page, scaleWidth, 0, 0, scaleHeight, 0, 0);
        doc.Close();
    }

【讨论】:

  • 对这样的任务使用像这样的常规 PdfWriter 可能是有损的:它会降低交互性(注释、JavaScript 等)并添加一定程度的 XObject 间接。基于PdfStamper 的解决方案没有这些缺点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多