mirror of
https://github.com/wmjordan/PDFPatcher.git
synced 2026-10-22 00:16:23 +08:00
234 lines
7.9 KiB
C#
234 lines
7.9 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.IO;
|
|
|
|
namespace MuPDFLib
|
|
{
|
|
public static class MuPdfConverter
|
|
{
|
|
public static byte[] ConvertPdfToTiff (byte[] image, float dpi, RenderType type, bool rotateLandscapePages, int maxSizeInPdfPixels, string pdfPassword) {
|
|
byte[] output = null;
|
|
|
|
if (image == null)
|
|
throw new ArgumentNullException ("image");
|
|
|
|
using (MuPDF pdfDoc = new MuPDF (image, pdfPassword)) {
|
|
using (MemoryStream outputStream = new MemoryStream ()) {
|
|
ImageCodecInfo info = null;
|
|
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
|
|
if (ice.MimeType == "image/tiff")
|
|
info = ice;
|
|
|
|
Bitmap saveTif = null;
|
|
for (int i = 1; i <= pdfDoc.PageCount; i++) {
|
|
int Width = 0;//Zero for no resize.
|
|
int Height = 0;//Zero for autofit height to width.
|
|
|
|
pdfDoc.Page = i;
|
|
|
|
Bitmap FirstImage = pdfDoc.GetBitmap (Width, Height, dpi, dpi, 0, type, rotateLandscapePages, maxSizeInPdfPixels);
|
|
if (FirstImage == null)
|
|
throw new Exception ("Unable to convert pdf to tiff!");
|
|
using (EncoderParameters ep = new EncoderParameters (2)) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
|
|
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionLZW);
|
|
if (type == RenderType.Monochrome) {
|
|
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
|
|
}
|
|
|
|
if (i == 1) {
|
|
saveTif = FirstImage;
|
|
saveTif.Save (outputStream, info, ep);
|
|
}
|
|
else {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
|
|
saveTif.SaveAdd (FirstImage, ep);
|
|
FirstImage.Dispose ();
|
|
}
|
|
if (i == pdfDoc.PageCount) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
|
|
saveTif.SaveAdd (ep);
|
|
saveTif.Dispose ();
|
|
}
|
|
}
|
|
}
|
|
output = outputStream.ToArray ();
|
|
}
|
|
}
|
|
return output;
|
|
}
|
|
|
|
public static bool ConvertPdfToTiff (string sourceFile, string outputFile, float dpi, RenderType type, bool rotateLandscapePages, int maxSizeInPdfPixels, string pdfPassword) {
|
|
bool output = false;
|
|
|
|
if (string.IsNullOrEmpty (sourceFile) || string.IsNullOrEmpty (outputFile))
|
|
throw new ArgumentNullException ();
|
|
|
|
using (MuPDF pdfDoc = new MuPDF (sourceFile, pdfPassword)) {
|
|
using (FileStream outputStream = new FileStream (outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) {
|
|
ImageCodecInfo info = null;
|
|
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
|
|
if (ice.MimeType == "image/tiff")
|
|
info = ice;
|
|
|
|
Bitmap saveTif = null;
|
|
for (int i = 1; i <= pdfDoc.PageCount; i++) {
|
|
pdfDoc.Page = i;
|
|
|
|
Bitmap FirstImage = pdfDoc.GetBitmap (0, 0, dpi, dpi, 0, type, rotateLandscapePages, maxSizeInPdfPixels);
|
|
if (FirstImage == null)
|
|
throw new Exception ("Unable to convert pdf to tiff!");
|
|
|
|
using (EncoderParameters ep = new EncoderParameters (2)) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
|
|
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionLZW);
|
|
if (type == RenderType.Monochrome) {
|
|
ep.Param[1] = new EncoderParameter (Encoder.Compression, (long)EncoderValue.CompressionCCITT4);
|
|
}
|
|
|
|
if (i == 1) {
|
|
saveTif = FirstImage;
|
|
saveTif.Save (outputStream, info, ep);
|
|
}
|
|
else {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
|
|
saveTif.SaveAdd (FirstImage, ep);
|
|
FirstImage.Dispose ();
|
|
}
|
|
if (i == pdfDoc.PageCount) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
|
|
saveTif.SaveAdd (ep);
|
|
saveTif.Dispose ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (File.Exists (outputFile))
|
|
output = true;
|
|
}
|
|
return output;
|
|
}
|
|
|
|
public static byte[] ConvertPdfToFaxTiff (byte[] image, float dpi, string pdfPassword) {
|
|
byte[] output = null;
|
|
const long Compression = (long)EncoderValue.CompressionCCITT4;
|
|
|
|
using (MuPDF pdfDoc = new MuPDF (image, pdfPassword)) {
|
|
using (MemoryStream outputStream = new MemoryStream ()) {
|
|
ImageCodecInfo info = null;
|
|
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
|
|
if (ice.MimeType == "image/tiff")
|
|
info = ice;
|
|
|
|
Bitmap saveTif = null;
|
|
for (int i = 1; i <= pdfDoc.PageCount; i++) {
|
|
int Width = 0;//Zero for no resize.
|
|
//int Height = 0;//Zero for autofit height to width.
|
|
float DpiX = dpi;
|
|
float DpiY = dpi;
|
|
|
|
pdfDoc.Page = i;
|
|
|
|
if (dpi == 200) {
|
|
Width = 1728;
|
|
DpiX = 204;
|
|
DpiY = 196;
|
|
}
|
|
else if (dpi == 300)
|
|
Width = 2592;
|
|
else if (dpi == 400)
|
|
Width = 3456;
|
|
|
|
Bitmap FirstImage = pdfDoc.GetBitmap (Width, 0, DpiX, DpiY, 0, RenderType.Monochrome, true, 0);
|
|
if (FirstImage == null)
|
|
throw new Exception ("Unable to convert pdf to tiff!");
|
|
|
|
using (EncoderParameters ep = new EncoderParameters (2)) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
|
|
ep.Param[1] = new EncoderParameter (Encoder.Compression, Compression);
|
|
|
|
if (i == 1) {
|
|
saveTif = FirstImage;
|
|
saveTif.Save (outputStream, info, ep);
|
|
}
|
|
else {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
|
|
saveTif.SaveAdd (FirstImage, ep);
|
|
FirstImage.Dispose ();
|
|
}
|
|
if (i == pdfDoc.PageCount) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
|
|
saveTif.SaveAdd (ep);
|
|
saveTif.Dispose ();
|
|
}
|
|
}
|
|
}
|
|
output = outputStream.ToArray ();
|
|
}
|
|
}
|
|
return output;
|
|
}
|
|
|
|
public static bool ConvertPdfToFaxTiff (string sourceFile, string outputFile, float dpi, string pdfPassword) {
|
|
bool output = false;
|
|
const long Compression = (long)EncoderValue.CompressionCCITT4;
|
|
|
|
using (MuPDF pdfDoc = new MuPDF (sourceFile, pdfPassword)) {
|
|
using (FileStream outputStream = new FileStream (outputFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) {
|
|
ImageCodecInfo info = null;
|
|
foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders ())
|
|
if (ice.MimeType == "image/tiff")
|
|
info = ice;
|
|
|
|
Bitmap saveTif = null;
|
|
for (int i = 1; i <= pdfDoc.PageCount; i++) {
|
|
int Width = 0;//Zero for no resize.
|
|
//int Height = 0;//Zero for autofit height to width.
|
|
float DpiX = dpi;
|
|
float DpiY = dpi;
|
|
|
|
pdfDoc.Page = i;
|
|
|
|
if (dpi == 200) {
|
|
Width = 1728;
|
|
DpiX = 204;
|
|
DpiY = 196;
|
|
}
|
|
else if (dpi == 300)
|
|
Width = 2592;
|
|
else if (dpi == 400)
|
|
Width = 3456;
|
|
|
|
Bitmap FirstImage = pdfDoc.GetBitmap (Width, 0, DpiX, DpiY, 0, RenderType.Monochrome, true, 0);
|
|
if (FirstImage == null)
|
|
throw new Exception ("Unable to convert pdf to tiff!");
|
|
using (EncoderParameters ep = new EncoderParameters (2)) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
|
|
ep.Param[1] = new EncoderParameter (Encoder.Compression, Compression);
|
|
|
|
if (i == 1) {
|
|
saveTif = FirstImage;
|
|
saveTif.Save (outputStream, info, ep);
|
|
}
|
|
else {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
|
|
saveTif.SaveAdd (FirstImage, ep);
|
|
FirstImage.Dispose ();
|
|
}
|
|
if (i == pdfDoc.PageCount) {
|
|
ep.Param[0] = new EncoderParameter (Encoder.SaveFlag, (long)EncoderValue.Flush);
|
|
saveTif.SaveAdd (ep);
|
|
saveTif.Dispose ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (File.Exists (outputFile))
|
|
output = true;
|
|
}
|
|
return output;
|
|
}
|
|
}
|
|
}
|