La joie de la manipulation des pdf hihihi
__________________________
............ Curtis: RTS 3D .............. ......
........... TeamMoteurProg...........
Bonjour,
Je viens de relire tout le fil de votre discussion car je suis très interressé par cette fonctionnalité : pouvoir créer une image d'une page d'un pdf.
J'aurais bien voulu pouvoir bénéficier de votre travail (je sais, je sais... je suis un peu flémmard, mais surtout pressé par le temps ) mais les liens en téléchargement ne sont plus disponible...
Est-il possible de remettre à disposition ce projet ?
Merci d'avance, et surtout bravo pour votre boulot !
Voila ce que j'utilise pour récupérer l'image d'une page:
try
{
// instanciate adobe acrobat
doc = (Acrobat.CAcroPDDoc)new Acrobat.AcroPDDocClass();
if (doc.Open(monCata.pdf))
{
if (doc.GetNumPages() > 0)
{
for (int i = 0; i < doc.GetNumPages(); i++)
{
// get reference to page
// pages use a zero based index so 0 = page1
page = (Acrobat.CAcroPDPage)doc.AcquirePage(i);
// get dimensions of page and create rect to indicate full size
Acrobat.AcroPoint pt = (Acrobat.AcroPoint)page.GetSize();
Acrobat.CAcroRect rect = new Acrobat.AcroRectClass();
rect.Top = 0;
rect.Left = 0;
rect.right = (short)(pt.x * 2);
rect.bottom = (short)(pt.y * 2);
// copy current page to clipboard as image
page.CopyToClipboard(rect, 0, 0, 200);
// get image from clipboard as bitmap
IDataObject data = Clipboard.GetDataObject();
Bitmap bmp = (System.Drawing.Bitmap)data.GetData(DataFormats.Bitmap);
bmp.Save(monCata.chemin_de_creation + monCata.nom + "\\Images_pages\\Image" + i.ToString() + ".jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
}
catch
{
// if we get here and doc is null then we were unable to instanciate Acrobat
if (doc == null) MessageBox.Show("Acrobat is not installed. Adobe Acrobat is required.");
}
finally
{
if (page != null) Marshal.ReleaseComObject(page);
if (doc != null) Marshal.ReleaseComObject(doc);
}
Richman dit : pouvoir créer une image d'une page d'un pdf
, alors c'est le code que j'ai fait qui t'interessera...
Ce topic a débouché sur deux façons d'utiliser un pdf (en entré) pour avoir des images (en sortie).
La 1ere : extraire les images d'un pdf... C'est le code que Nej a fait.
La 2e : transformer chaque page pdf en image, c'est le code que j'ai fait (voir page 10 ou 9 pour un code optimal + nécessite programme pdftoppm.exe <- début du topic).
Donc à toi de voir ce que tu veux faire
__________________________
Sujet résolu ? Pensez à mettre le tag
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.
comme dit précedemment l'incovenient de la méthode de Nej pour récupérer l'image est qu'elle utilise le vieux protocole COM et que ton application ne pourra PAS être utilisée sur un ordi sans une licence Adobe Acrobat.
Mais si tu as la licence, c'est sur qu'elle est trés efficace.
Perso, je te conseille le code de Czayfaboo :
1 - Créé une classe dans ton projet et copie colle ce code :
public class PDFToPPM : IDisposable
{
public event EventHandler Exited;
public event StringEventHandler FileCreated;
public event StringEventHandler FileWrited;
public delegate void StringEventHandler(string s);
bool closed = false;
string commandLine;
string pdfFile;
string outputDirectory;
string outputFileBaseName;
List<string> outputFiles;
int firstPageToPrint;
int lastPageToPrint;
int resolution;
bool mono;
bool gray;
bool freetype;
bool aa;
bool aaVector;
string ownerPassword = String.Empty;
string userPassword = String.Empty;
string path;
private string error;
private string lastFile = String.Empty;
Process process;
FileSystemWatcher watcher;
/// <summary>
/// Constructor
/// </summary>
/// <param name="pdfFile">The full path of the pdf file</param>
/// <param name="outputFileBaseName">The full path of the created file. Exemple : C:\\monFichier</param>
public PDFToPPM(string pdfFile, string outputFileBaseName)
{
this.pdfFile = pdfFile;
this.outputFileBaseName = outputFileBaseName;
if (outputFileBaseName[outputFileBaseName.Length - 1] == '\\')
this.outputFileBaseName += "file";
outputDirectory = outputFileBaseName;
while (outputDirectory[outputDirectory.Length - 1] != '\\')
outputDirectory = outputDirectory.Remove(outputDirectory.Length - 1);
watcher = new FileSystemWatcher(outputDirectory);
watcher.EnableRaisingEvents = true;
watcher.Created += new FileSystemEventHandler(watcherCreated);
watcher.Changed += new FileSystemEventHandler(watcherCreated);
path = Path.Combine(Environment.CurrentDirectory, "xpdf\\pdftoppm.exe");
}
public void Run()
{
outputFiles = new List<string>();
closed = false;
process = new Process();
StringBuilder sb = new StringBuilder();
if (firstPageToPrint > 0)
sb.Append("-f " + firstPageToPrint.ToString() + " ");
if (lastPageToPrint > 0)
sb.Append("-l " + lastPageToPrint.ToString() + " ");
if (resolution > 0)
sb.Append("-r " + lastPageToPrint.ToString() + " ");
if (mono)
sb.Append("-mono ");
if (gray)
sb.Append("-gray ");
if (freetype)
sb.Append("-freetype yes ");
if (aa)
sb.Append("-aa yes ");
if (aaVector)
sb.Append("-aaVector yes ");
if (ownerPassword != String.Empty)
sb.Append("-opw " + ownerPassword + " ");
if (userPassword != String.Empty)
sb.Append("-upw " + userPassword + " ");
sb.Append("\"");
sb.Append(pdfFile);
sb.Append("\" \"");
sb.Append(outputFileBaseName);
sb.Append("\"");
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = path;
startInfo.Arguments = sb.ToString();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
commandLine = startInfo.FileName + " " + startInfo.Arguments;
process.StartInfo = startInfo;
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(processExited);
process.Start();
}
public void Dispose()
{
watcher.Dispose();
}
private void watcherCreated(object sender, FileSystemEventArgs e)
{
if (!outputFiles.Contains(e.FullPath))
{
outputFiles.Add(e.FullPath);
if (lastFile != String.Empty && FileWrited != null)
FileWrited(lastFile);
lastFile = e.FullPath;
if (FileCreated != null)
FileCreated(e.FullPath);
}
}
public void WaitForExit()
{
if (!closed)
process.WaitForExit();
}
private void processExited(object sender, EventArgs e)
{
if (!closed)
{
if (lastFile != String.Empty && FileWrited != null)
FileWrited(lastFile);
if (Exited != null)
Exited(sender, e);
switch (process.ExitCode)
{
case 0: error = "No error."; break;
case 1: error = "Error opening a PDF file."; break;
case 2: error = "Error opening an output file."; break;
case 3: error = "Error related to PDF permissions."; break;
case 99:
default:
error = "Other error";
break;
}
process.Close();
closed = true;
}
}
#region Properties
public StreamReader StandardOutput
{
get { return process.StandardOutput; }
}
public StreamReader StandardError
{
get { return process.StandardError; }
}
/// <summary>
/// Get the exit code of the process
/// </summary>
public string Error
{
get { return error; }
}
/// <summary>
/// Get the command line used by the process
/// </summary>
public string CommandLine
{
get { return commandLine; }
}
/// <summary>
/// File's names of the generated ppm files
/// </summary>
public string[] OutputFiles
{
get { return outputFiles.ToArray(); }
}
/// <summary>
/// The file to convert
/// </summary>
public string PdfFile
{
get { return pdfFile; }
set { pdfFile = value; }
}
/// <summary>
/// The output directory
/// </summary>
public string OutputDirectory
{
get { return outputDirectory; }
}
/// <summary>
/// The output file base name
/// </summary>
public string OutputFileBaseName
{
get { return outputFileBaseName; }
}
/// <summary>
/// First page to print
/// </summary>
public int FirstPageToPrint
{
get { return firstPageToPrint; }
set { firstPageToPrint = value; }
}
/// <summary>
/// Last page to print
/// </summary>
public int LastPageToPrint
{
get { return lastPageToPrint; }
set { lastPageToPrint = value; }
}
/// <summary>
/// Resolution in DPI (default is 150)
/// </summary>
public int Resolution
{
get { return resolution; }
set { resolution = value; }
}
/// <summary>
/// Generate a monochrome PBM file
/// </summary>
public bool Mono
{
get { return mono; }
set { mono = value; }
}
/// <summary>
/// Generate a grayscale PGM file
/// </summary>
public bool Gray
{
get { return gray; }
set { gray = value; }
}
/// <summary>
/// Enable or disable FreeType font rasterrizer
/// </summary>
public bool FreeType
{
get { return freetype; }
set { freetype = value; }
}
/// <summary>
/// Enable or disable font anti-aliasing
/// </summary>
public bool Aa
{
get { return aa; }
set { aa = value; }
}
/// <summary>
/// Enable or disable vector anti-aliasing
/// </summary>
public bool AaVector
{
get { return aaVector; }
set { aaVector = value; }
}
/// <summary>
/// Owner password (for encrypted files)
/// </summary>
public string OwnerPassword
{
get { return ownerPassword; }
set { ownerPassword = value; }
}
/// <summary>
/// User password (for encrypted files)
/// </summary>
public string UserPassword
{
get { return userPassword; }
set { userPassword = value; }
}
#endregion
}
Richman, une question, comment as-tu trouvé cette page ? Google ?
__________________________
Prière de ne pas oublier le magnifique tag (résolu) si votre sujet l'est !
Effectivement, j'ai mis à jour mon FTP ça a tout bousillé. Bon je remet.
€dit : les liens ont été mis à jour ! Yeah ! re€dit : Czayfaboo m'a croisé là... J'y crois pas ^^.
__________________________
Prière de ne pas oublier le magnifique tag (résolu) si votre sujet l'est !
A mon avis Pistache google doit être la réponse cra quand je cherchais je tombais régulièrement sur ce topic^^
Sinon je poste vite fait pour savoir s'il était possible de changer les "fonctionnalités" d'adobe acrobat ou si vous aviez des pistes car je cherches en vain, je voudrais modifier le menu du click gauche sur le pdf!
Un réel merci à tous pour votre rapidité à me répondre.
Je reprends à mon compte la déclaration de Nej en début de discussion :
"J'aime vraiment beaucoup ce forum".
Alors, j'ai récupéré tous les fichiers et j'ai suivi toutes les étapes pour les intégrer à mon projet : copie des fichiers et ajout de références.
Mon souci maintenant porte sur MagickNet.dll.
Impossible de la référencer correctement.
Je suis sous VS 2005, je développe en C#, et je n'ai pas installé ni C ni C++.
Mon dev se base sur le Framework .NET 2.0
J'ai essayé de placer Microsoft.VisualC.Dll dans system32 mais rien n'y fait.
Existe-t-il une version de cette dll qui fonctionne dans mon cas ?
Encore une fois merci.