Hello. I am having an issue with Safari’s print scaling using MigraDoc. Documents are automatically scaled to 93% which causes them to print too small.
I appreciate that this is a Safari thing, but the same issue doesn’t occur with PdfSharp.
There seems to be something that MigraDoc does which causes Safari to think the page is too large to print at 100% and therefore scale it to 93%.
I appreciate any assistance anyone can offer.
Thanks!
The following code uses MigraDoc and scales to 93% in Safari: -
Code:
// PDFsharp-MigraDoc 6.1.1 from NuGet
// Legacy .NET Framework 4.8 application
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using PdfSharp.Pdf;
using PdfSharp.Pdf.Advanced;
using System.IO;
namespace SafariTest
{
public class HelloMigraDoc
{
public static byte[] CreateDocument()
{
var document = new Document();
var section = document.AddSection();
var paragraph = section.AddParagraph();
paragraph.AddText("Hello World!");
var pdfRenderer = new PdfDocumentRenderer
{
Document = document,
PdfDocument =
{
Options =
{
FlateEncodeMode = PdfFlateEncodeMode.BestCompression,
NoCompression = false,
CompressContentStreams = true
}
}
};
pdfRenderer.RenderDocument();
AddViewerPreferences(pdfRenderer); // this has no effect in Safari
using (var stream = new MemoryStream())
{
pdfRenderer.PdfDocument.Save(stream, false);
return stream.ToArray(); // results in undesired print scaling of 93% in Safari
}
}
public static void AddViewerPreferences(PdfDocumentRenderer pdfRenderer)
{
// Turn off print scaling.
if (!pdfRenderer.PdfDocument.Internals.Catalog.Elements.ContainsKey("/ViewerPreferences"))
pdfRenderer.PdfDocument.Internals.Catalog.Elements["/ViewerPreferences"] = new PdfDictionary(pdfRenderer.PdfDocument);
var viewerPreferences = pdfRenderer.PdfDocument.Internals.Catalog.Elements["/ViewerPreferences"] is PdfReference viewerPreferencesReference
? viewerPreferencesReference.Value as PdfDictionary
: pdfRenderer.PdfDocument.Internals.Catalog.Elements["/ViewerPreferences"] as PdfDictionary;
if (viewerPreferences != null) viewerPreferences.Elements["/PrintScaling"] = new PdfName("/None");
}
}
}
The following code uses PdfSharp and scales to 100% in Safari: -
Code:
// PDFsharp-MigraDoc 6.1.1 from NuGet
// Legacy .NET Framework 4.8 application
using System.IO;
using PdfSharp.Pdf;
using PdfSharp.Drawing;
namespace SafariTest
{
public class HelloPdfSharp
{
public static byte[] CreateDocument()
{
using (var document = new PdfDocument())
{
var page = document.AddPage();
using (var gfx = XGraphics.FromPdfPage(page))
{
var font = new XFont("Verdana", 12);
gfx.DrawString("Hello World!", font, XBrushes.Black,
new XRect(72, 72, page.Width.Point - 144, page.Height.Point - 144),
XStringFormats.TopLeft);
}
using (var stream = new MemoryStream())
{
document.Save(stream, false);
return stream.ToArray(); // results in desired print scaling of 100% in Safari
}
}
}
}
}