Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-06-2010, 16:00   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[iText (C# o Java)]rimuovere pagine da pdf

Ciao a tutti

Qualcuno di voi che usa le librerie iText (per java o per .net) saprebbe indirizzarmi su come poter rimuovere delle pagine da un pdf composto da più pagine ?

Su di un link ho letto che:

Codice:
One way to do it:
Delete = Copy PDF pages and skip pages to be removed thereby leaving the pages you want.
Il che mi va bene se devo scartare delle pagine all'inizio o alla fine (purchè in sequenza) ma se devo scartare la 3, 51, 99 , dovrei avere un modo di 'ciclare' (che sinceramente non conosco) che quando incontra il numero di pagina in questione, lo salti e vada a quello successivo.

Sto provando a ragionarci su in pseudo codice:
Codice:
input:
1) pdf di origine 
2) pagine da non copiare

elaborazione:
dal pdf di origine prendo il numero di pagine che lo compongono

le pagine da non copiare le memorizzo in un dizionario o in una lista 
o un semplice array

ciclare (ma non so come) avendo come:
start = 0 ; end < numeroPaginePdf ; contatore++
se contatore = numeroPaginaDaScartare, contatore +1

output:
pdf - pagineScartate
Ovviamente, siete autorizzati a ridere, tirarmi pomodori virtuali e a citarmi sul daily wtf .

Grazie mille

RaouL.


EDIT: posto il ragionamento in codice:

Codice:
private void test()
{
    numPages = 100;
    badPages = new int[] { 3, 63, 98 };
    for (int i = 0; i < numPages; i++)
    {
         for (int j = 0; j < badPages.Length; j++)
         {
              if (badPages[j] == i)
             {
                  i++;
             }
                    
          }
          //copiaPagina(i);
     }
}
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek

Ultima modifica di RaouL_BennetH : 23-06-2010 alle 16:30.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2010, 08:04   #2
!k-0t1c!
Member
 
Iscritto dal: Jul 2008
Messaggi: 237
Il codice che segue richiede solo che tu passi il numero di pagine totali del PDF e una sequenza di pagine da eliminare (nota che il codice considera scontata l'assenza di numeri di pagina da eliminare duplicati. Se questo non fosse il tuo caso basta aggiungere una chiamata a Distinct prima di OrderBy).
Con LINQ gli elementi della sequenza vengono disposti in ordine crescente, poi la sequenza viene trasformata in lista. In questo modo hai la certezza che la pagina in testa alla lista sia la pagina con numero più basso tra quelle da eliminare.
Iniziando il processo di copia ti serve semplicemente verificare che la lista di pagine da eliminare non sia vuota e che la pagina in testa alla lista abbia lo stesso numero di quella che stai copiando. Se questo è il caso, invece di copiare la pagina elimini l'elemento in testa alla lista, altrimenti procedi alla copia.
L'uso della LinkedList invece che di una qualsiasi list è per minimizzare la complessità algoritmica, la quale in questo caso ha O(1) per l'eliminazione della testa invece dell'O(n) di una List normale.

Ecco il codice:

Codice:
private void EliminaPagine(int totalePagine, IEnumerable<int> pagineDaEliminare)
{
	var badPages = new LinkedList<int>(pagineDaEliminare.OrderBy(numPagina => numPagina));
	for(int i = 0; i < totalePagine; i++)
	{
		if(badPages.Count > 0 && badPages.First == i)
		{
			//aggiorniamo la lista
			badPages.RemoveFirst();
		}
		else
		{
			CopiaPagina(i);
		}
	}
}
Infine, anche se banale, bisogna sottolineare che questo codice richiede che i numeri di pagina delle pagine da eliminare siano offset a partire da zero rispetto alla prima pagina.
Ogni valore negativo impedisce al codice di funzionare, mentre indicare il numero di pagina contanto la prima come pagina 1 causerebbe chiaramente l'eliminazione delle pagine successive a quelle da eliminare effettivamente o, in caso si tentasse di eliminare l'ultima pagina, nessun'eliminazione.

Se utilizzi la libreria Code Contracts di Microsoft ti consiglio un'Ensures(badPages.Count == 0) per accertarti che tutte le pagine siano state eliminate.

Ultima modifica di !k-0t1c! : 26-06-2010 alle 08:08.
!k-0t1c! è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2010, 00:22   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Ciao

Ho dimenticato di dire che potevo muovermi soltanto in ambito net 2.0

Ad ogni modo, credo di poter riuscire lo stesso a studiare la soluzione da te proposta e magari adattarla al 2.0.

In questi giorni comunque sono riuscito nell'intento:

L'utente inserisce il numero di pagine da eliminare separate da virgola.
Nei limiti delle mie conoscenze attuali, ecco come ho svolto il tutto:

Codice:
using System;
using System.Collection.Generics;
using System.IO;
using System.Text;
using System.Text.RegularExpression;
using iTextSharp.text;
using iTextSharp.text.pdf;


public class PdfHelper
{
      public static void SkipPages(string source, string destination, List<int> badPages)
      {
           try
           {
              PdfReader sourcePdf = new PdfReader(source);
              int totalNumberOfPages = sourcePdf.NumberOfPages;
              int firstPage = 1;
              
              Document sourceDoc = new Document(sourcePdf.GetPageSizeWithRotation(1));
                
              FileStream stream = new FileStream(destination, FileMode.Create));
               
              PdfWriter destinationPdf = PdfWriter.GetIstance(sourceDoc, stream);
         
              sourceDoc.Open();

              PdfContentByte pages = destinationPdf.DirectContent;

              for(int i = firstPage; i <= totalNumerOfPages; i++)
              {
                  for(int j = 0; j < badPages.Count; j++)
                  {
                      if(badPages[j] == i)
                      {
                         i++;
                      }
                   }
                   sourceDoc.SetPageSize(source.GetPageSizeWithRotation(i));
                   sourceDoc.NewPage();

                   PdfImportedPage currentPage = destinationPdf.GetImportedPage(source, i);
                   //blabla code per l'orientamento 

               }
              //blabla
Il metodo per aggiungere le pagine invece è questo:

Codice:
//DoSkip()

List<int> badPages = new List<int>();
string[] pagesToSkip = Regex.Split(txtPages.Text, @"\D+");
foreach(string page in pagesToSkip)
{
     int pageNumber;
     if(int.TryParse(page, out pageNumber))
     {
        badPages.Add(pageNumber);
      }
}
SkipPages(sourceFileName, mySaveDialog.FileName, badPages);
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
Apple apre Music Hall, una sala concerto...
Adobe arriva su Gemini e Claude: nuove f...
Non solo Fideuram: quasi 2 milioni di it...
I lettori CD di fascia alta potrebbero s...
Tutto il meglio di Amazon weekend: 5 nov...
Proscenic P15+ a 113€ su Amazon: scopa e...
TP-Link Wi-Fi 6 a 59,99€ e Tenda 4G03 Pr...
Un quasi top di gamma a 461€: lo smartph...
Roborock Saros 20 Neo e Flow Complete: 3...
Mac mini si trasforma: chip a 2 nanometr...
Su Amazon c'è un super TV Samsung...
La Cina ha rilasciato un satellite dallo...
Il satellite LINK è rientrato nel...
L'ESA risponde alle critiche di Jared Is...
La NASA annuncia il nuovo telescopio spa...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v